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脚本将Bing的每日图片作为桌面的教程
May 04 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
python与mysql数据库交互的实现
Jan 06 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
Feb 07 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
总结Python常用的魔法方法
May 25 Python
Python实现照片卡通化
Dec 06 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
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP的5个安全措施小结
2012/07/17 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
js实现简单div拖拽功能实例
2015/05/12 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
python字典与json转换的方法总结
2020/12/28 Python
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
试用期转正员工自我评价
2014/09/18 职场文书
个人查摆剖析材料
2014/10/04 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
五年级学生期末评语
2014/12/26 职场文书
2016年安全月活动总结
2016/04/06 职场文书