Python 异常处理机制还提供了一个
finally 语句,通常用来为 try 块中的程序做扫尾清理工作。
在整个异常处理机制中,
finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。
基于 finally 语句的这种特性,在某些情况下,当 try 块中的程序打开了一些物理资源(文件、数据库连接等)时,由于这些资源必须手动回收,而回收工作通常就放在 finally 块中。
读者可能会问,回收这些物理资源,必须使用 finally 块吗?当然不是,但使用 finally 块是比较好的选择。首先,try 块不适合做资源回收工作,因为一旦 try 块中的某行代码发生异常,则其后续的代码将不会得到执行;其次 except 和 else 也不适合,它们都可能不会得到执行。而 finally 块中的代码,无论 try 块是否发生异常,该块中的代码都会被执行。
举个例子:
try:
a = int(input("请输入 a 的值:"))
print(20/a)
except:
print("发生异常!")
else:
print("执行 else 块中的代码")
finally :
print("执行 finally 块中的代码")
运行此程序:
请输入 a 的值:4
5.0
执行 else 块中的代码
执行 finally 块中的代码
可以看到,当 try 块中代码为发生异常时,except 块不会执行,else 块和 finally 块中的代码会被执行。
再次运行程序:
请输入 a 的值:a
发生异常!
执行 finally 块中的代码
可以看到,当 try 块中代码发生异常时,except 块得到执行,而 else 块中的代码将不执行,finally 块中的代码仍然会被执行。
finally 块的强大还远不止此,即便当 try 块发生异常,且没有合适和 except 处理异常时,finally 块中的代码也会得到执行。例如:
try:
#发生异常
print(20/0)
finally :
print("执行 finally 块中的代码")
程序执行结果为:
执行 finally 块中的代码
Traceback (most recent call last):
File "D:\python3.6\1.py", line 3, in <module>
print(20/0)
ZeroDivisionError: division by zero
可以看到,当 try 块中代码发生异常,导致程序崩溃时,在崩溃前 Python 解释器也会执行 finally 块中的代码。
本文链接:http://task.lmcjl.com/news/9732.html