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 相关文章推荐
Python获取Windows或Linux主机名称通用函数分享
Nov 22 Python
python 实现UTC时间加减的方法
Dec 31 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
利用python实现AR教程
Nov 20 Python
提升python处理速度原理及方法实例
Dec 25 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
如何在python中执行另一个py文件
Apr 30 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
python如何写个俄罗斯方块
Nov 06 Python
python Pexpect模块的使用
Dec 25 Python
Python快速优雅的批量修改Word文档样式
May 20 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
理解javascript回调函数
2014/12/28 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
python实现一次创建多级目录的方法
2015/05/15 Python
使用Python来开发微信功能
2018/06/13 Python
python使用matplotlib画饼状图
2018/09/25 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
钳工实习自我鉴定
2013/09/19 职场文书
出国留学自荐信
2013/10/25 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
工地材料员岗位职责
2015/04/11 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang