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

4.1.5 引入finally从句

从上文里我们能看到,如果在try从句里发生异常,则会进入对应的except流程;如果没有发生,则会进入else流程。有些功能(比如释放I/O对象或数据库连接资源)不管是否发生异常或者不管发生何种异常都需要被执行,此类代码可以放到finally从句里。在如下的FinallyDemo.py范例中,将演示finally与try和except整合使用的效果。


01 # coding=utf-8
02 empIDList = ['1','2']
03 try:
04     empIDList.remove('1')
05 finally:
06     print('remove 1,in finally') # 会执行
07 try:
08     1/0
09 except ZeroDivisionError as e:
10     print(e) # 会执行
11 finally:
12     print('devided 0,in finally') # 会执行
13 try:
14     print(1/1) # 会执行
15 except ZeroDivisionError as e:
16     print(e) # 不会执行
17 finally:
18     print('devided 0,in finally') # 会执行
19 
20 try:
21     empIDList.remove('3')
22 finally:
23     print('remove 3,in finally') # 会执行,执行后退出
24 print('continue') # 不会执行

在第3行到第6行里,是finally直接跟在try之后,这里没有发生异常。从运行结果来看,finally里第6行的代码会执行。

在第7行到第12行的代码里,是try…except…finally整合使用,这里出现了除零异常,也进入对应的except从句。从运行结果来看,第12行finally从句里的打印语句会执行。在第13行到第18行的try…except…finally从句里,虽然没有异常,但也会运行第18行的finally部分代码。

不论是否发生了异常,finally从句都会被执行到。在使用过程中,不建议finally只和try一起使用,原因是缺乏异常处理代码。比如在第20~23行的代码里发生了“移除不存在元素”的异常,此时虽然会进入第23行的finally从句,但是异常得不到except从句处理,所以程序会直接终止,从而不再执行后继的第24行代码。