当 Python 编写的程序发生异常时,程序会自动停止并抛出异常报告,Shell 也是这样的,如果使用一种方法来处理异常,可以做到跳过异常继续执行程序。

在 Python 中处理异常使用了 try-except 代码块处理。try-except 代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时该怎么办。这样可以让程序发生异常后仍继续运行。

ZeroDivisionError 异常

Zero Division Error 英文翻译过来叫 零除错误,其实就是在数学中,零不能做除数,当这么做了之后,就会抛出这个异常。

print(26/0)

# 执行后
Traceback (most recent call last):
  File "/Users/feiyi/Documents/Study/Python/study.py", line 234, in <module>
    print(26/0)
ZeroDivisionError: division by zero

使用 try-except 代码块来处理该异常。

try:
    print(26/0)
except ZeroDivisionError:
    print("0不可以做除数")

将执行的代码放到 try 的缩进下,如果执行成功,将跳过 except,如果执行后创建了 ZeroDivisionError 这个对象,也就是 try 中的代码执行之后报错 ZeroDivisionError ,将会执行 except 部分的输出。

这样可以让用户看到报错后明显知道原因,也可以不必非要停止程序,其实处理异常也就是将用户看不懂的报错输出转换为可读懂的输出,增加了报错可读性。

小实验

要求用户一次输入两个数字,做除法运算,当第二个数字为0是会抛出 ZeroDivisionError 异常,并用 try-except 做处理。

print("请输入两个数字,我将计算他们的商")
print("输入 q 退出")

while True:
    first_num = input("请输入第一个数字,它将作为被除数: ")  
    if first_num == "q":
        break
    second_num = input("请输入第二个数字,它将作为除数  : ")
    if second_num == "q":
        break
    try:
        print(int(first_num)/int(second_num))
    except ZeroDivisionError:
        print("第二个数字不可以为0哦!")

try-except-else

以上述代码为例进行else的使用

print("请输入两个数字,我将计算他们的商")
print("输入 q 退出")

while True:
    first_num = input("请输入第一个数字,它将作为被除数: ")  
    if first_num == "q":
        break
    second_num = input("请输入第二个数字,它将作为除数  : ")
    if second_num == "q":
        break
    try:
        result = int(first_num)/int(second_num)  
    except ZeroDivisionError:
        print("第二个数字不可以为0哦!")
    except ValueError:  # 这里我新增了一个异常处理,我在输入数字时不小心按了方向键后抛出了该异常
        print("包含非法字符")
    else:
        print(result)

以上 try-except-else 代码块部分表示,try 执行成功后,执行 else,抛出异常后,在 except 中寻找对应异常对象进行处理。

在进行 Python 代码编写调试时,有可能在使用过程中发生异常的地方,模拟异常并做相应处理即可。

忽略报错

如果在抛出异常时,希望程序默不作声,不做处理,也不提示用户任何信息,在 except 中可以使用 pass,如:

try:
    result = int(first_num)/int(second_num)  
except ZeroDivisionError:
    pass

练习文件异常处理

创建2个文件 cats.txt 和 dogs.txt,每个文件至少存储 3 行数据,分别为猫和狗的种类。

with open('cats.txt', 'w') as cat:
    cat.write("波斯猫\n")
    cat.write("英短\n")
    cat.write("折耳猫\n")

with open('dogs.txt', 'w') as dog:
    dog.write("博美\n")
    dog.write("二哈\n")
    dog.write("阿拉斯加\n")

filename = 'cats.txt'
try:
    with open(filename) as cat:
        print(cat.read())
except FileNotFoundError:
    print(filename + " 文件不存在,请检查!")


filename = 'dogs.txt'
with open('dogs.txt') as dog:
    print(dog.read())

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0