Python爬虫、数据分析与可视化:工具详解与案例实战
上QQ阅读APP看书,第一时间看更新

4.1.3 同时处理多个异常

在上文里,针对同一个try代码块,我们给出了多个except处理异常的范例代码。这种情况在实际项目里是比较常见的,因为某块代码可能引发多类异常。

针对此类情况,除了用多个except从句外,还可以在同一个except里带有多个异常处理类。在如下的MoreExceptionDemo.py范例中,我们就将给出这种做法。


01 # coding=utf-8
02 def calAvg(total,number):
03     try:
04         return total/number
05     except(ZeroDivisionError, TypeError, Exception) as e:
06         print(e)
07 print(calAvg(100,2)) # 正确的调用
08 print(calAvg(100,0)) # 引发除0异常,本身打印None
09 print(calAvg(100,'2')) # 引发TypeError,本身打印None
10 print('Continue')

在第2行定义的calAvg方法里,我们将根据参数计算平均值;在第5行的except从句里,我们同时引入了3个异常处理类。在第8行和第9行调用calAvg方法时,由于除数是0、参数不正确而分别引发了ZeroDivisionError和TypeError,由此进入了第6行的异常处理流程。

这里请注意,第5行except还包含了Exception这个异常处理的基类,这是因为哪怕引入再多的处理异常类,也未必涵盖掉所有可能发生异常的种类。一旦出现具体异常类无法处理的异常,程序就会终止,所以一般会用异常处理的基类Exception来兜底。

针对多类异常,可以用同一类方法来处理,比如这里仅需输出异常的信息,就可以像本范例那样在一个except后包含多个异常处理类。相反,针对不同种类的异常,要用不同的方式处理,比如出现除零异常就需要输出异常,而出现读写文件异常时则需要发邮件提示,所以需要在一个try代码块后面用多个except携带不同的异常处理类,在不同的except从句里编写不同的处理逻辑。对于这两种情况,大家可以根据项目需求灵活地选用。