Piszę dekorator, aby zastosować do funkcji. Powinien przechwycić każdy wyjątek, a następnie podnieść niestandardowy wyjątek na podstawie oryginalnego komunikatu wyjątku. (Dzieje się tak dlatego, że suds generuje ogólny wyjątek WebFault, z którego wiadomości analizuję wyjątek generowany przez usługę WWW i zgłaszam wyjątek Pythona, aby odzwierciedlić go.)Python: dekorator wyjątków. Jak zachować stacktrace
Jednak po podniesieniu niestandardowego wyjątku w opakowaniu, chcesz, aby stacktrace wskazywało na funkcję, która podniosła oryginalny wyjątek WebFault. Do tej pory podniosłem poprawny wyjątek (dynamicznie analizuje komunikat i tworzy instancję klasy wyjątku). Moje pytanie: Jak mogę zachować stacktrace, aby wskazać oryginalną funkcję, która spowodowała wyjątek WebFault?
from functools import wraps
def try_except(fn):
def wrapped(*args, **kwargs):
try:
fn(*args, **kwargs)
except Exception, e:
parser = exceptions.ExceptionParser()
raised_exception = parser.get_raised_exception_class_name(e)
exception = getattr(exceptions, raised_exception)
raise exception(parser.get_message(e))
return wraps(fn)(wrapped)
Czy spojrzał na 'traceback' moduł? http://docs.python.org/library/traceback.html – stderr
Podczas zawijania w dekoratorze użyj [functools.wrap] (https://docs.python.org/2/library/functools.html) –
możliwy duplikat ["Wewnętrzny wyjątek" (z tracebackiem) w Pythonie?] (Http://stackoverflow.com/questions/1350671/inner-exception-with-traceback-in-python) –