在《Python中的异常处理3-1》中提到,用except可以捕获所有的异常。实际上,在程序运行的过程中,出现异常的原因有很多,比如下标超出范围、除数为0、变量未定义等。
1 except语句加上具体的异常类型
可以在except语句之后加上具体的异常类型,表示该语句只捕获指定的异常,代码如下所示。
a, b = input('请输入被除数和除数:').split()
try:
print(int(a)/int(b))
except ZeroDivisionError:
print('除数不能为0。')
其中,except语句只捕获ZeroDivisionError异常,当除数是0时,就会Python会抛出该异常。程序处理ZeroDivisionError异常的输入及输出如图1所示。
图1 处理ZeroDivisionError异常
从图1中可以看出,运行程序后输入的值是“1 0, 即此时a的值是“1”,b的值是“0”。
int(b)的值是0,Python会抛出ZeroDivisionError异常,该异常被我们编写的代码处理,显示“除数不能为0”。
当输入的是“1 a”时,b的值是“a”,此时int(b)无法将其转换为整型,会抛出ValueError异常。但是由于我们的代码没有捕获ValueError异常,因此该异常会交由Python处理,此时会显示红色报错信息,代码如图2所示。
图2 ValueError异常的处理
2 同时处理多个异常
对于在“1 except语句加上具体的异常类型”中提到的一段代码可能会出现多个异常的情况,我们可以使用多个except来捕获,代码如下所示。
a, b = input('请输入被除数和除数:').split()
try:
print(int(a)/int(b))
except ZeroDivisionError:
print('除数不能为0。')
except ValueError:
print('输入的不是数字。')
当输入“1 a”时,由于代码捕获了ValueError异常,因此会显示“输入的不是数字”,如图3所示。
图3 捕获多个异常