发生未处理的异常时如何跳过sys.exitfunc

发生未处理的异常时如何跳过sys.exitfunc

天涯离梦残月幽梦 发布于 2021-10-09 字数 469 浏览 826 回复 3 原文

正如你所看到的,即使在这个程序本该停止运行之后,它也会从坟墓里发出声音。有没有办法在出现异常时“注销”exitfunction?

import atexit

def helloworld():
    print("Hello World!")

atexit.register(helloworld)

raise Exception("Good bye cruel world!")

输出

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    raise Exception("Good bye cruel world!")
Exception: Good bye cruel world!
Hello World!

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝颜夕 2021-10-11 3 楼

除了调用os.u exit()以避免注册的退出处理程序外,还需要捕获未处理的异常:

import atexit
import os

def helloworld():
    print "Hello World!"

atexit.register(helloworld)    

try:
    raise Exception("Good bye cruel world!")

except Exception, e:
    print 'caught unhandled exception', str(e)

    os._exit(1)
羁拥 2021-10-10 2 楼

如果你打电话

import os
os._exit(0)

退出处理程序将不会被调用,也不会被应用程序中的其他模块调用或注册。

为你鎻心 2021-10-10 1 楼

我真的不知道为什么要这样做,但是您可以安装一个excepthook,每当引发未修补的异常时,Python就会调用它,并在其中清除 atexit 模块中注册函数的数组。
诸如此类:

import sys
import atexit

def clear_atexit_excepthook(exctype, value, traceback):
    atexit._exithandlers[:] = []
    sys.__excepthook__(exctype, value, traceback)

def helloworld():
    print "Hello world!"

sys.excepthook = clear_atexit_excepthook
atexit.register(helloworld)

raise Exception("Good bye cruel world!")

请注意,如果从注册的 atexit 函数引发异常,它可能会表现不正确(但即使未使用此钩子,该行为也会很奇怪)。