上QQ阅读APP看书,第一时间看更新
4.3.4 合理确定异常的影响范围
在实际项目场景里,发生异常时应当把因异常造成的影响控制到最小的范围。比如在从10个文件里读取交易信息时,如果读取一个文件发生异常,最多应该是仅仅不处理该文件,其他9个文件依然要处理。在如下的ExceptionLessScope.py范例中,我们给出了“尽可能缩小异常影响范围”的实践技巧。
01 # coding=utf-8 02 empPriceDict=[{'name': 'Mike', 'salary': 10000},{'name': 'Tom', 'salary': '15000'}, {'name': 'John', 'salary':12000}] 03 try: 04 for item in empPriceDict: 05 item['salary'] = item['salary']*1.1 # 每人工资增长10% 06 except Exception as e: 07 print(e) 08 print('Error, name is:' + item['name']) 09 print(empPriceDict)# Mike工资涨了,但John没有 10 for item in empPriceDict: 11 try: 12 item['salary'] = item['salary']*1.1 # 每人工资增长10% 13 except Exception as e: 14 print(e) 15 print('Error, name is:' + item['name']) 16 print(empPriceDict)# 除了出错的Tom,其他人的工资都涨了
在第2行,我们定义了一个列表,在其中以字典的方式存储了员工和工资的信息。
在第4行和第5行的for循环里,我们依次遍历列表里的每个员工,把每个人的工资都增长10%。注意,整个for循环是包含在try…except代码块里的。从第9行的输出结果来看,一旦处理Tom的工资出错,就会退出整个for循环,导致Tom后面的员工John的工资没有处理。
我们预期的是,哪怕在其中有某个员工的工资处理出错,也可以提示对应的出错信息,但不应该影响到后继数据的处理。所以在第10行到第15行的代码里,是把每次for遍历的代码用try语句监控。从第16行的输出结果来看,处理Tom信息出问题后,后继John的工资也得到了正确的处理。
在上述范例中,我们除了演示“尽可能缩小异常影响范围”的实践要点之外,还在except处理异常的从句里输出了出错员工的姓名,在实际项目里,应该把相关文字记录到日志文件里,这样相关人员就能根据提示人工地修订错误数据了。