2013-03-06 13 views
7

mogę złapać i zrzucić wyjątek (i odpowiadający StackTrace), która stałaby się zamknięcie programu nie robiąc coś takiego:Czy istnieje sposób na zareagowanie na podniesienie wyjątku do początku programu bez próby/z wyjątkiem Pythona?

try: 
    # whole program 
except Execption as e: 
    dump(e) 
    raise 

kiedyś ciągu zewnętrznych wypadków bibliotecznych, i chciałbym reagować na Pythonie i umierania zapisz powody, dla których to robi. Nie chcę, aby wyjątek powodował awarię programu, chcę tylko informacje o debugowaniu.

Coś jak:

signals.register('dying', callback) 

def callback(context): 
    # dumping the exception and 
    # stack trace from here 

Czy to w ogóle możliwe?

Odpowiedz

12

Tak, rejestrując sys.excepthook() function:

import sys 

def myexcepthook(type, value, tb): 
    dump(type, value, tb) 

sys.excepthook = myexcepthook 

Ten zastępuje hak domyślny, który drukuje traceback do stderr. Jest wywoływany za każdym razem, gdy podniesiony zostanie nieprzechwycony wyjątek, a interpreter zaraz wyjdzie.

Jeśli chcesz ponownie użyć oryginalnego haka wyjątku od haka niestandardowego, zadzwoń sys.__excepthook__:

def myexcepthook(type, value, tb): 
    dump(type, value, tb) 
    sys.__excepthook__(type, value, tb) 
+0

kocham cię tyle teraz. –

+0

Nie ma za co. :-D –

+0

Mogę z powodzeniem (z C++) wywołać funkcję z PyObject_CallObject(), ale jeśli celowo wyślę nieprawidłową liczbę parametrów, zwróci ona wartość null. Jak mogę użyć tego haka, aby zwrócić wartość z powrotem do skryptu? – Qwerty

Powiązane problemy