为了防止程序运行中遇到异常而意外终止,编程时应对可能出现异常进行捕获并处理。在Python程序中,使用try、except、else、finally四个关键字来实现异常的捕捉与处理。
try-except语句
try-except语句可以捕获异常并进行处理,其语法格式如下:
try:
# 可能出现异常的语句
except 异常类名:
# 处理异常的语句
当try语句块中某条语句出现异常时,程序就不再执行try语句块后面的语句,而是直接执行except语句块中的语句,如下所示。
1 try:
2 a = float(input('请输入被除数:'))
3 b = float(input('请输入除数:'))
4 print(a, '/', b, '结果为', a / b)
5 print('运算结束')
6 except ZeroDivisionError:
7 print('除数不能为0')
8 print('程序结束')
程序运行时,输入8与2,则运行结果如下图所示。
再次运行程序,输入8与0,则运行结果如下图所示。
从两次运行结果可看出,程序没有触发异常与触发异常执行的流程并不一致。程序中一旦发生异常,就不会执行try语句块中剩余的语句,而是直接执行except语句块。另外,本程序捕捉并处理了异常,因此,当输入的除数为0时,程序可以正常结束,而不是终止运行。
大家需注意,上例程序只能捕捉except后面的异常类,如果发生其他类型异常,程序依然会终止,例如,运行上例程序,输入ab再回车,则程序出现错误,如下图所示。
在上图中,错误信息提示字符串类型不能转化为浮点型,为了保证程序正常运行,此时就需要捕获并处理多个异常,其语法格式如下:
try:
# 可能出现异常的语句
except 异常类名1:
# 处理异常1的语句
except 异常类名2:
# 处理异常2的语句
...
接下来演示捕获并处理多种异常,如下所示。
1 try:
2 a = float(input('请输入被除数:'))
3 b = float(input('请输入除数:'))
4 print(a, '/', b, '结果为', a / b)
5 print('运算结束')
6 except ZeroDivisionError:
7 print('除数不能为0')
8 except ValueError:
9 print('传入参数无效')
10 print('程序结束')
程序运行时,输入ab并回车,则运行结果如下图所示。
在上例中,程序中增加了处理ValueError异常。在程序中,虽然开发者可以编写处理多种异常的代码,但异常是防不胜防的,很有可能再出现其他异常,此时就需要捕捉并处理所有可能发生的异常,其语法格式如下:
try:
# 可能出现异常的语句
except 异常类名:
# 处理异常的语句
except:
# 与上述异常不匹配时,执行此语句块
如果程序发生了异常,但是没有找到匹配的异常类别,则执行不带任何匹配类型的except语句后面的语句块。
接下来演示捕获并处理所有异常,如下所示。
1 try:
2 a = float(input('请输入被除数:'))
3 b = float(input('请输入除数:'))
4 print(a, '/', b, '结果为', a / b)
5 print('运算结束')
6 except ZeroDivisionError:
7 print('除数不能为0')
8 except:
9 print('其他错误')
10 print('程序结束')
程序运行时,输入ab并回车,则运行结果如下图所示。
在上例中,第8行通过except语句可以处理除ZeroDivisionError异常外的其他所有异常。