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发送arp欺骗攻击代码分析
Jan 16 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
Python进程间通信之共享内存详解
Oct 30 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
让代码变得更易维护的7个Python库
Oct 09 Python
python简单实现AES加密和解密
Mar 28 Python
python从入门到精通 windows安装python图文教程
May 18 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
OpenCV读取与写入图片的实现
Oct 13 Python
python用opencv 图像傅里叶变换
Jan 04 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中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php上传图片类及用法示例
2016/05/11 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
js实现全选和全不选
2020/07/28 Javascript
python+opencv实现动态物体识别
2018/01/09 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
诚信考试承诺书
2014/03/27 职场文书
集中整治工作方案
2014/05/01 职场文书
课外小组活动总结
2014/08/27 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
公司2014年度工作总结
2014/12/10 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python