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设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 Python
python3中bytes和string之间的互相转换
Feb 09 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
Python 实现交换矩阵的行示例
Jun 26 Python
Python何时应该使用Lambda函数
Jul 02 Python
python递归下载文件夹下所有文件
Aug 31 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
python绘制箱型图
Apr 27 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
itchat接口使用示例
2017/10/23 Python
多个应用共存的Django配置方法
2018/05/30 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
应届生个人求职信模板
2013/11/26 职场文书
技能比赛获奖感言
2014/02/14 职场文书
个人租房协议书范本
2014/09/30 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
员工工作及收入证明
2014/10/28 职场文书
技术员岗位职责
2015/02/04 职场文书
cf战队宣传语
2015/07/13 职场文书
信息简报范文
2015/07/21 职场文书
表扬信范文
2019/04/22 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
Django如何创作一个简单的最小程序
2021/05/12 Python
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
MongoDB使用场景总结
2022/02/24 MongoDB