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中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
PyQt5实现登录页面
May 30 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
Pandas数据结构之Series的使用
Mar 31 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
给多个地址发邮件的类
2006/10/09 PHP
php桌面中心(二) 数据库写入
2007/03/11 PHP
生成卡号php代码
2008/04/09 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
PHP实现八皇后算法
2019/05/06 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
Python多线程爬虫简单示例
2016/03/04 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
python如何制作缩略图
2019/04/30 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
Go语言设计模式之结构型模式
2021/06/22 Golang