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中给List添加元素的4种方法分享
Nov 28 Python
详解Python中break语句的用法
May 14 Python
Python对列表排序的方法实例分析
May 16 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
对python判断ip是否可达的实例详解
Jan 31 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
JS长整型精度问题实例分析
2015/01/13 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
Python字符串格式化的方法(两种)
2017/09/19 Python
Python实现图片识别加翻译功能
2019/12/26 Python
python识别验证码图片实例详解
2020/02/17 Python
python字典按照value排序方法
2020/12/28 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
英语自荐信范文
2013/12/11 职场文书
行政助理的岗位职责
2014/02/18 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
安全先进班组材料
2014/12/26 职场文书
公司转让协议书
2016/03/19 职场文书
Python爬取某拍短视频
2021/06/11 Python
什么是Python装饰器?如何定义和使用?
2022/04/11 Python