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

4.3.1 尽可能缩小try的代码块

在实际项目里,为了避免因异常而导致的程序中断,我们应该把所有可能出现异常的代码放入try代码块。有些程序员为了图省事,会任意扩大try代码块的范围,这种做法会引发功能性上的问题。在如下的TooLongTryDemo.py范例中,大家将会感受到这种做法的危害。


01 # coding=utf-8
02 def calAvg(total,number):
03     return total/number
04 def findIndex(str,element):
05     print('In find Index')
06     return str.index(element)
07 
08 try:
09     calAvg(100,0) # 引发除0异常,但会影响到findIndex方法
10     print(findIndex('str', 's'))
11 except Exception as e:
12     print(e)

假设根据业务规则,在第2行定义的calAvg和在第4行定义的findIndex是两个功能独立的函数,其中calAvg函数在调用时发生异常的话,不应该影响到findIndex函数的调用。

在第8行到第10行的try代码块里,由于监控的范围不当,在第9行calAvg函数调用发生除零异常时会直接跳转到第1211行的except从句,而第10行的findIndex函数并没有如预期那样被调用。这就是扩大try监控范围造成的后果。

正确的做法如下所示,对于每段独立的需要监控的代码块,需要被不同的try语句来包含。


01 try:
02     calAvg(100,0) # 引发除0异常,但会影响到findIndex方法    
03 except Exception as e:
04     print(e)
05 try:
06     print(findIndex('str', 's'))    
07 except Exception as e:
08     print(e)

在真实项目场景里,多段独立的但可能引发异常的功能模块,也应当如上述范例所示,用不同的try…except从句包含,从而避免“异常处理扩大化”的问题。