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函数中的函数(闭包)用法实例
Mar 15 Python
python 换位密码算法的实例详解
Jul 19 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
python中的字符串内部换行方法
Jul 19 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python @classmethod 的使用场合详解
Aug 23 Python
python开发前景如何
Jun 11 Python
Python 如何操作 SQLite 数据库
Aug 17 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
自动分页的不完整解决方案
2007/01/12 PHP
wordpress之wp-settings.php
2007/08/17 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
Python中operator模块的操作符使用示例总结
2016/06/28 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
python tkinter组件使用详解
2019/09/16 Python
使用Python实现分别输出每个数组
2019/12/06 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
Html5新增标签有哪些
2017/04/13 HTML / CSS
Linux的主要特性
2016/09/03 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
诉前财产保全担保书
2014/05/20 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL