Python退出时强制运行一段代码的实现方法


Posted in Python onApril 29, 2020

设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境。

Python退出时强制运行一段代码的实现方法 

这段逻辑本身非常简单:

setup()
test()
clean()

但由于测试的代码比较复杂,你总是在调试的时候程序异常,导致每次clean()函数还没有来得及运行,程序就崩溃了。

你可能想到,如果这样写会怎么样呢:

setup() 
try: 
  text() 
except Exception as e: 
  print('运行异常:', e) 
clean()

似乎看起来,程序一定会运行到clean()函数,但是,如果你代码写的多,你就应该知道,滥用try...except...会让你非常痛苦。例如它突然给你打印一个运行异常: 1。你根本不知道是哪里出了问题,也不知道具体出了什么问题。为了找到问题,你必须让程序把错误爆出来。但这样一来,clean()又不能正常运行了。

有什么办法,既能让程序报错,又能在报错已经还能运行clean()呢?

这个时候,我们就可以使用Python自带的atexit这个模块了。它的使用方法非常简单:

import atexit 
 
@atexit.register 
def clean(): 
  print('清理环境相关的代码') 
 
setup() 
test()

这样一来,我们不需要显式调用clean函数了。无论程序正常结束,还是程序异常报错,clean函数里面的内容总会执行。

如下图所示:

Python退出时强制运行一段代码的实现方法

atexit使用中有下面几个注意事项:

你可以注册多个退出函数,他们会按照注册时间从晚到早以此执行。例如:

import atexit 
 
@atexit.register 
def clean_1(): 
  ... 
 
@atexit.register 
def clean_2(): 
  ...

会先运行clean_2()后运行clean_1()

  • 如果clean()函数有参数,那么你可以不用装饰器,而是直接调用atexit.register(clean_1, 参数1, 参数2, 参数3='xxx')。
  • 如果程序是被你没有处理过的系统信号杀死的,那么注册的函数无法正常执行。
  • 如果发生了严重的Python内部错误,你注册的函数无法正常执行。
  • 如果你手动调用了os._exit(),你注册的函数无法正常执行。

到此这篇关于Python退出时强制运行一段代码的实现方法的文章就介绍到这了,更多相关python退出强制运行代码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python获取当前时间的方法
Jan 14 Python
讲解Python中if语句的嵌套用法
May 14 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 #Python
如何使用python切换hosts文件
Apr 29 #Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 #Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 #Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 #Python
Python通过Pillow实现图片对比
Apr 29 #Python
Python unittest单元测试框架实现参数化
Apr 29 #Python
You might like
星际RPG字典
2020/03/04 星际争霸
php smarty函数扩展
2010/03/15 PHP
php操作xml
2013/10/27 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
Python字符串转换成浮点数函数分享
2015/07/24 Python
Android分包MultiDex策略详解
2017/10/30 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
phpquery中文手册
2021/03/18 PHP
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
品恩科技软件测试面试题
2014/10/26 面试题
思想品德课教学反思
2014/02/10 职场文书
2016年元旦致辞
2015/08/01 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
解决MySQL报“too many connections“错误
2022/04/19 MySQL