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网络编程学习笔记(三):socket网络服务器
Jun 09 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
详解Python中find()方法的使用
May 18 Python
Golang与python线程详解及简单实例
Apr 27 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python的pip有什么用
Jun 17 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
详解如何用Python实现感知器算法
Jun 18 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 5.3.5安装memcache注意事项小结
2011/04/12 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
理解PHP中的stdClass类
2014/04/18 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
Python中的 enum 模块源码详析
2019/01/09 Python
python实现淘宝购物系统
2019/10/25 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
设计师个人求职信范文
2014/02/02 职场文书
报名委托书
2015/01/29 职场文书
超市员工辞职信范文
2015/05/12 职场文书
小学总务工作总结
2015/08/13 职场文书
少先队中队工作总结
2015/08/14 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Python+Tkinter制作专属图形化界面
2022/04/01 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android