本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2020-05-19 | 编程技术 | 1794 次阅读 | 等你评论 | 0 次点赞 | 繁体

设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境。

这段逻辑本身非常简单:

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函数里面的内容总会执行。

如下图所示:

Alt text

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(),你注册的函数无法正常执行。
via:https://mp.weixin.qq.com/s/lNwSBhcp9ktwgaGWpXNq-A

标签: python

猜你喜欢
Python小技巧之不用GUI,照样实现图形界面
小王平常的工作是做数据处理的,手中自然握有大量的数据,在日常工作中经常需要根据业务的需求提取相应的数据,有些需求是固定的,写好脚本之后只要定期提取数据就行了。但是,像我这么懒的人,这种工作怎么可...
python | 协程与多进程的完美结合
我们知道,协程本质上是单线程单进程,通过充分利用 IO 等待时间来实现高并发。在 IO 等待时间之外的代码,还是串行运行的。因此,如果协程非常多,多少每个协程内部的串行代码运行时间超过了 IO ...
为什么网站知道我的爬虫使用了代理?
经常有朋友问:为什么自己的爬虫明明设置了代理,但一访问网站就能被发现。我总结了几种常见的情况。实际上,网站要识别你是否使用了代理,并不一定非要什么高深的反爬虫机制,也不需要使用 AI 识别用户行...
三行代码捅穿 CloudFlare 的五秒盾
经常写爬虫的同学,肯定知道 CloudFlare 的五秒盾。当你没有使用正常的浏览器访问网站的时候,它会返回如下这段文字:Checking your browser before accessi...
loguru 简单方便的 Python 日志记录管理模块
这是个啥?在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 Handler、Formatter 来进行一些...
window10 彻底关闭自动更新
一般来说,及时更新升级的操作系统是比较安全的。但是有的人对自动升级却非常讨厌。这里将介绍如何完全禁止 win10 自动升级。 有多种方法,参照其一即可,保险起见可全部设置。 # 一、方法一(修
MAC系统制作ubuntu启动U盘教程
最近新买了一台便宜的低功耗小主机惠普 T620,CPU 是 AMD 的 GX-415GA,4G 内存,准备给他刷个 ubuntu 系统,用来做简易的 NAS,并且安装 homeassistant 用作
别再用PS了,教你用五行Python代码实现批量抠图
对于会 PhotoShop 的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图。不过对于一些比较复杂的图,有时候还是需要花点时间的,今天就给大家带了一个非常快速简单的办法,用 Python
Typecho 评论弹幕插件下载及食用教程
视频弹幕大家已经很熟悉了,他是直接显现在视频上的评论,可以以滚动、停留甚至更多动作特效方式出现在视频上,是观看视频的人发送的简短评论。 最近在开发 [超赞网站导航](https://one.wa
(首次提交评论需审核通过才会显示,请勿重复提交)