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 ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
Python匹配中文的正则表达式
May 11 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Python 实现一行输入多个值的方法
Apr 21 Python
python opencv实现证件照换底功能
Aug 19 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
Django视图扩展类知识点详解
Oct 25 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
python——全排列数的生成方式
Feb 26 Python
Python简单实现词云图代码及步骤解析
Jun 04 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
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
js中生成map对象的方法
2014/01/09 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python万年历实现代码 含运行结果
2017/05/20 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
TensorFlow变量管理详解
2018/03/10 Python
python输出决策树图形的例子
2019/08/09 Python
Python3运算符常见用法分析
2020/02/14 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
社区学雷锋活动策划方案
2014/01/30 职场文书
收款授权委托书
2014/10/02 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
高中生社会实践心得体会
2016/01/14 职场文书