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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
python模块之StringIO使用示例
Apr 08 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
python实现教务管理系统
Mar 12 Python
解决python 输出是省略号的问题
Apr 19 Python
用python生成1000个txt文件的方法
Oct 25 Python
为什么说Python可以实现所有的算法
Oct 04 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
Jan 09 Python
win10安装python3.6的常见问题
Jul 01 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
php 生成随机验证码图片代码
2010/02/08 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
jQuery选择器用法实例详解
2015/12/17 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
js new Date()实例测试
2019/10/31 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python编程求质数实例代码
2018/01/31 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
pyqt5实现登录界面的模板
2020/05/30 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
python调用私有属性的方法总结
2020/07/24 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
人力资源专员自我评价怎么写
2013/09/19 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
食堂管理制度范本
2015/08/04 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA
Nginx 常用配置
2022/05/15 Servers
HttpClient实现表单提交上传文件
2022/08/14 Java/Android