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中的lambda表达式的用法
Aug 28 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
Python设计模式之策略模式实例详解
Jan 21 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
Django中ORM外键和表的关系详解
May 20 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python2手动安装更新pip过程实例解析
Jul 16 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改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
jquery中的过滤操作详细解析
2013/12/02 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
javascript折半查找详解
2015/01/26 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
对python判断是否回文数的实例详解
2019/02/08 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
Python中if有多个条件处理方法
2020/02/26 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
职称自我鉴定
2013/10/15 职场文书
商铺租赁意向书
2014/04/01 职场文书
工作收入证明模板
2014/10/10 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
PHP命令行与定时任务
2021/04/01 PHP
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL