4.1.2 使用异常处理类

一旦发生异常,就会进入except处理流程,此时Python的异常处理类会处理异常。在上例中,except后面没有指定处理类,会默认地采用Exception这个常规异常处理类的基类来处理。

此外还有诸如处理迭代器异常的StopIteration和处理访问序列时索引错误的IndexError类。在表4.1里,列出了常用异常处理类及其适用场景。

表4.1 常用异常处理类

也就是说,在except后面,我们还可以指定处理异常的类。在如下的ExceptionDemo.py范例中,我们将看到这种做法。


01 # coding=utf-8
02 empIDList = ['1','2']
03 try:
04     print(empIDList[3]) # 索引出错触发异常
05 except IndexError:
06     print('Index Error')
07 print('continue') # 异常得到处理,能执行该句打印
08 try:
09     100+'$' # 函数参数类型错误
10 except TypeError:
11     print('Type Error')
12 try:
13     1/0 # 除零异常
14 except TypeError:
15     print('Type Error in devided 0') # 不会进入
16 except ZeroDivisionError:
17     print('ZeroDivision Error') # 会输出该句语句

在第3行和第4行的try从句里,由于访问列表时索引越界,因此会进入第5行的except处理流程,由IndexError类来处理异常。在第9行,加号操作符要么两边都是数字,要么都是字符串,所以会导致函数参数类型出错的异常,从而进入第11行的处理流程。

注意,针对第13行的除零异常,我们用第14行和第16行的两个except从句来处理,它们所带有的异常处理类不同。从运行结果来看,只是进入第16行的ZeroDivisionError处理流程,并没有进入第14行。

也就是说,一旦在try从句里出现异常,该异常就会被对应的异常处理类处理,而不会进入带有不相关异常处理类的except从句。