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正则表达式介绍
Aug 06 Python
python求解水仙花数的方法
May 11 Python
flask中过滤器的使用详解
Aug 01 Python
python 自动批量打开网页的示例
Feb 21 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
python基于递归解决背包问题详解
Jul 03 Python
Python3 合并二叉树的实现
Sep 30 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
Python如何加载模型并查看网络
Jul 15 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
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP7修改的函数
2021/03/09 PHP
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
小程序实现搜索框
2020/06/19 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python学习笔记_数据排序方法
2014/05/22 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
python二维图制作的实例代码
2020/12/03 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
linux面试题参考答案(7)
2012/10/29 面试题
省优秀教师事迹材料
2014/01/30 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
525心理活动总结
2014/07/04 职场文书
建筑节能汇报材料
2014/08/22 职场文书
死者家属慰问信
2015/03/24 职场文书
经费申请报告
2015/05/15 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书