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 12 Python
python实现读Excel写入.txt的方法
Apr 29 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
python3 webp转gif格式的实现示例
Dec 10 Python
pytorch自定义二值化网络层方式
Jan 07 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
python学习之panda数据分析核心支持库
May 07 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP删除非空目录的函数代码小结
2013/02/28 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
js中的string.format函数代码
2020/08/11 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
公司人事管理制度
2015/08/05 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
python之json文件转xml文件案例讲解
2021/08/07 Python
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏