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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
Python获取网页上图片下载地址的方法
Mar 11 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
分享Python文本生成二维码实例
Jan 06 Python
Python中int()函数的用法浅析
Oct 17 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
django haystack实现全文检索的示例代码
Jun 24 Python
python中threading和queue库实现多线程编程
Feb 06 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实现的在线人员函数库
2008/04/09 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
js实现进度条的方法
2015/02/13 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
python实现bitmap数据结构详解
2014/02/17 Python
python实现合并两个数组的方法
2015/05/16 Python
Python 中 Meta Classes详解
2016/02/13 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
实时获取Python的print输出流方法
2019/01/07 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
物业经理求职自我评价
2013/09/22 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
英语邀请函范文
2015/02/02 职场文书
消防宣传标语大全
2015/08/03 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
MySQL创建管理HASH分区
2022/04/13 MySQL