Python try except finally资源回收的实现


Posted in Python onJanuary 25, 2021

Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。

注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

在整个异常处理机制中,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 (most recent call last):
  File "D:\python3.6\1.py", line 3, in <module>
    print(20/0)
ZeroDivisionError: division by zero

可以看到,当 try 块中代码发生异常,导致程序崩溃时,在崩溃前 Python 解释器也会执行 finally 块中的代码。

到此这篇关于Python try except finally资源回收的实现的文章就介绍到这了,更多相关Python try except finally  内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
python opencv之SURF算法示例
Feb 24 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
浅谈django orm 优化
Aug 18 Python
python中partial()基础用法说明
Dec 30 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
python 实现表情识别
Nov 21 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
Python中lru_cache的使用和实现详解
Jan 25 #Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 #Python
Ubuntu20下的Django安装的方法步骤
Jan 24 #Python
selenium+超级鹰实现模拟登录12306
Jan 24 #Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 #Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 #Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 #Python
You might like
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
js实现鼠标拖曳效果
2020/12/30 Javascript
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
python实现excel读写数据
2021/03/02 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
Python批量启动多线程代码实例
2020/02/18 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
内刊编辑求职自荐书范文
2014/02/19 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
聚美优品的广告词
2014/03/14 职场文书
新闻报道策划方案
2014/06/11 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
答辩状格式范本
2015/05/22 职场文书
家庭经济困难证明
2015/06/23 职场文书