Python try except finally资源回收的实现
Python异常处理机制还提供了一个finally语句,通常用来为try块中的程序做扫尾清理工作。
注意,和else语句不同,finally只要求和try搭配使用,而至于该结构中是否包含except以及else,对于finally不是必须的(else必须和tryexcept搭配使用)。
在整个异常处理机制中,finally语句的功能是:无论try块是否发生异常,最终都要进入finally语句,并执行其中的代码块。
基于finally语句的这种特性,在某些情况下,当try块中的程序打开了一些物理资源(文件、数据库连接等)时,由于这些资源必须手动回收,而回收工作通常就放在finally块中。
Python垃圾回收机制,只能帮我们回收变量、类对象占用的内存,而无法自动完成类似关闭文件、数据库连接等这些的工作。
读者可能会问,回收这些物理资源,必须使用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(mostrecentcalllast):
File"D:\python3.6\1.py",line3,in
print(20/0)
ZeroDivisionError:divisionbyzero
可以看到,当try块中代码发生异常,导致程序崩溃时,在崩溃前Python解释器也会执行finally块中的代码。
到此这篇关于Pythontryexceptfinally资源回收的实现的文章就介绍到这了,更多相关Pythontryexceptfinally 内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!