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搭建简易服务器分析与实现
Dec 15 Python
python文件和目录操作方法大全(含实例)
Mar 12 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
Python时间获取及转换知识汇总
Jan 11 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Python高级特性 切片 迭代解析
Aug 23 Python
Python3监控疫情的完整代码
Feb 20 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
python 制作一个gui界面的翻译工具
May 14 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使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
js获取域名的方法
2015/01/27 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
js实现简单选项卡制作
2020/08/05 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
python看某个模块的版本方法
2018/10/16 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
公务员职业生涯规划书范文  
2014/01/19 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
股东授权委托书
2014/10/15 职场文书
团拜会主持词
2015/07/04 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸