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本地与全局命名空间用法实例
Jun 16 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
关于Python数据结构中字典的心得
Dec 04 Python
教你用Python创建微信聊天机器人
Mar 31 Python
python中返回矩阵的行列方法
Apr 04 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
python 调用js的四种方式
Apr 11 Python
python实现手机推送 代码也就10行左右
Apr 12 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
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
纯php生成随机密码
2015/10/30 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
jQuery 使用手册(二)
2009/09/23 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
python3 flask实现文件上传功能
2020/03/20 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
database面试题
2013/03/28 面试题
幼儿园运动会入场词
2014/02/10 职场文书
五年级数学教学反思
2014/02/11 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python