簡體   English   中英

如何在發生未處理的異常時跳過sys.exitfunc

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM