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 相关文章推荐
Django imgareaselect手动剪切头像实现方法
May 26 Python
如何用itertools解决无序排列组合的问题
May 18 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
Python中的单继承与多继承实例分析
May 10 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
python列表推导式入门学习解析
Dec 02 Python
详解python itertools功能
Feb 07 Python
TensorFLow 变量命名空间实例
Feb 11 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
Python如何加载模型并查看网络
Jul 15 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
微信API接口大全
2015/04/15 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
javascript 写类方式之十
2009/07/05 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
模具设计与制造专业推荐信
2014/02/16 职场文书
迎新晚会策划方案
2014/06/13 职场文书
博士论文答辩开场白
2015/06/01 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
vue判断按钮是否可以点击
2022/04/09 Vue.js