
1.15 异常处理
在程序编写完成以后,难免会出现这样或那样的错误,如果不能捕获这些错误并进行处理,程序运行过程就会中断。本节介绍在Python中进行异常处理的方法。
1.15.1 常见的异常
在Python中常见的异常如表1-21所示。对于不同类型的错误,Python给它们指定了名称。在编程过程中如果出现错误,则可以捕获该错误,判断是否是指定类型的错误并进行相应的处理。
表1-21 Python中常见的异常

1.15.2 异常捕获——单分支的情况
在Python中使用try…except…else…finally…这样的结构捕获异常,根据需要可以使用简单的单分支形式,也可以使用多分支、带else和带finally等形式。
首先介绍单分支的情况。单分支捕获异常的语法格式为:

或者

第1种形式捕获所有错误,第2种形式捕获指定错误。其中,try部分正常执行指定语句,except部分捕获错误并进行相关的显示和处理。一般尽量避免使用第1种形式,或者在多分支情况下处理未知错误。
在下面的代码中,try部分试图使用一个没有声明和赋值的变量,使用except捕获NameError类型的错误并输出。

因为使用了没有声明的变量,所以捕获到“名称f未定义”的错误,即输出为:

1.15.3 异常捕获——多分支的情况
如果捕获到的错误可能属于几种类型,则使用多分支的形式进行处理。在多分支情况下,语法格式可以为:

下面这段代码执行除法运算,如果出现错误,则会捕获到除数为0的错误和变量未定义的错误,在except语句中用元组指定这两个错误的名称,然后输出捕获到的错误结果。

输出捕获到的错误是“除数为0”,即:

多分支的情况也可以写成下面的形式,按照先后顺序进行判断。

改写上面的示例代码,如下所示。

将得到相同的输出结果:

1.15.4 异常捕获——try…except…else…
在单分支和多分支的情况下捕获错误并进行处理,如果没有捕获到错误怎么处理呢?这就要用到本节介绍的try…except…else…结构,如下所示。其中,else部分在没有发现异常时进行处理。

下面的代码计算3/2,没有捕获到错误时输出一些等号。

计算结果为1.5,没有出错,输出一些等号。

1.15.5 异常捕获——try...finally...
在try...finally...结构中,无论是否发生异常都会执行finally部分的语句。其语法格式如下:

在下面的示例代码中,计算3/0,因为除数为0,所以except部分会捕获到除数为0的错误,输出出错信息。但是即使出错,也会执行finally部分的语句进行处理。

输出下面的结果,第1行是除数为0的出错信息,第2行是finally部分的输出结果。
