上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从句包含,从而避免“异常处理扩大化”的问题。