第52课 异常的守护者

异常守护者通常可以帮助我们发现异常,并定位提示异常问题,而不让程序运行奔溃。
异常处理
除法计算器的异常处理:

单击菜单栏Run→Run Module选项来运行程序,程序运行结果如下:
输入被除数:78
输入除数:2
如果除数等于0,程序运行结果是什么呢?

程序报错了。
输入被除数:78
输入除数:0
ZeroDivisionError:division by zero
除数输入0,在进行运算的时候,程序报错了。
错误的原因是:ZeroDivisionError:division by zero,因为除数不能为0。
这个错误原因导致程序崩溃,不能继续执行了。
这就需要“异常”出场来保卫编程世界的正常运行。我们近距离地看看“异常守护者”。
代码块1. try-except

依次单击菜单栏Run→Run Module选项来运行程序,程序运行结果如下:
输入被除数:36
输入除数:0
注意:除数不能为。

(1)程序中使用了try-except代码块。
·通过try-except代码块捕获异常并进行处理。
·try-except代码块用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
try-except代码块的语法是:

(2)在上述程序中,try语句后的语句块为:

当这段代码出现ZeroDivisionError错误的时候,会被except语句捕获,然后执行except语句后面的代码块:

(3)ZeroDivisionError是异常守护者中的一员。异常守护者有很多成员,它们家族等级制度森严。
BaseException是守护者的老大,它是所有异常的基类。
每个守护者都是一个类,它们的等级是由继承关系决定的,例如ZeroDivisionError的父类是Exception,那么Exception异常的地位比ZeroDivisionError高,战斗力更强,不仅能处理ZeroDivisionError能处理的异常,还能处理ZeroDivisionError不能处理的异常。
异常很奇怪,一起探究一下它们里面到底有什么吧。
想要知道当前异常的内容,不妨将它打印出来。


程序运行结果如下:
输入被除数:1
输入除数:0
division by zero
在程序中,通过print(e)将异常类的内容打印出来了。
代码块2. try-except-else
try-except代码块用来处理程序中可能出现的异常,将可能发生异常的代码放到try代码块中。Python还提供了try-except-else代码块,将没有异常的时候要执行的代码块放到else后面。
我们来改造除法程序。

程序运行结果如下:
输入被除数:12
输入除数:2
(1)在程序中,我们使用了try-except-else代码块,将在没有异常时需要执行的任务写在else后面。
语法如下:

(2)运行程序,输入被除数12,除数2,程序运行正常,没有出现异常。所以执行else后面的语句print(res),将结果打印在屏幕上。
代码块3. try-finally
当有人触电或者因电路引发火灾时,我们就需要立即关闭总电闸。
触电和电路着火,我们都可以看作异常的发生,虽然发生了异常,但是有些事情必须去做,比如关掉总电闸。
在程序中,也有类似的情况,无论是否发生异常,都要执行的代码。就像上学一样,不会因为刮风或者下雨就停止。
假设无论我们的除法程序是否正常退出或者发生异常,我们都要说一句“我进行了除法运算”。要怎么写这个程序呢?

无异常运行
输入被除数,除数,程序运行结果如下:
输入被除数:12
输入除数:4
我进行了除法运算