5

正如你所看到的,即使程序应该已经死了,它也会从坟墓里说话。有没有办法在出现异常时“取消注册”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!
4

3 回答 3

5

我真的不知道您为什么要这样做,但是您可以安装一个异常钩子,只要引发未捕获的异常,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的行为(但即使未使用此钩子,行为也会很奇怪)。

于 2008-09-17T08:21:20.027 回答
0

如果你打电话

import os
os._exit(0)

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

于 2008-09-17T08:15:58.883 回答
0

除了调用 os._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)
于 2008-09-17T08:25:14.713 回答