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 时间处理datetime实例
Sep 06 Python
详解python函数传参是传值还是传引用
Jan 16 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Python 多线程共享变量的实现示例
Apr 17 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python使用永中文档转换服务
May 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批量生成缩略图的代码
2008/07/19 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
js读取配置文件自写
2014/02/11 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python虚拟环境项目实例
2017/11/20 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
员工年终演讲稿
2014/01/03 职场文书
大学生职业生涯规划书前言
2014/01/09 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python