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中的一些类型转换函数小结
Feb 10 Python
python二叉树的实现实例
Nov 21 Python
python的re模块应用实例
Sep 26 Python
python if not in 多条件判断代码
Sep 21 Python
在centos7中分布式部署pyspider
May 03 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python3中的json模块使用详解
May 05 Python
Python封装原理与实现方法详解
Aug 28 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
python多进程间通信代码实例
Sep 30 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
Python异常类型以及处理方法汇总
Jun 05 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
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
vue中如何使用ztree
2018/02/06 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
python实现简单ftp客户端的方法
2015/06/28 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
结构工程个人自荐信范文
2013/11/30 职场文书
招商业务员岗位职责
2013/12/16 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
语文教研活动总结
2014/07/02 职场文书
大专学生求职自荐信
2014/07/06 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
民间借贷借条范本
2015/05/25 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
《包身工》教学反思
2016/02/23 职场文书