上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从句里编写不同的处理逻辑。对于这两种情况,大家可以根据项目需求灵活地选用。