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 re模块介绍
Nov 30 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
在Python的Django框架中包装视图函数
Jul 20 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Python 通过打码平台实现验证码的实现
May 13 Python
python flask解析json数据不完整的解决方法
May 26 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
python绘制随机网络图形示例
Nov 21 Python
Python内置异常类型全面汇总
May 28 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 INI配置文件的解析实现分析
2011/01/04 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php生成扇形比例图实例
2013/11/06 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php生成RSS订阅的方法
2015/02/13 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP代码优化技巧小结
2015/09/29 PHP
js验证表单第二部分
2006/11/25 Javascript
List Installed Software Features
2007/06/11 Javascript
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
分享一个常用的javascript静态类
2014/12/31 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
微信跳一跳游戏python脚本
2020/04/01 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
Python 创建TCP服务器的方法
2020/07/28 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
谢师宴家长致辞
2015/07/27 职场文书
Go timer如何调度
2021/06/09 Golang