[英]How to skip sys.exitfunc when unhandled exceptions occur
正如你所看到的,即使該計划應該已經死亡,它也會從墳墓中說出來。 有沒有辦法在例外的情況下“取消注冊”退出功能?
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!
我真的不知道你為什么要這樣做,但是你可以安裝一個異常錯誤,每當引發一個未捕獲的異常時它將由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
注冊函數引發異常,它可能會表現不正確(但即使沒有使用此掛鈎,行為也會很奇怪)。
如果你打電話
import os
os._exit(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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.