Estoy escribiendo un decorador para aplicar a una función. Debería detectar cualquier excepción y luego generar una excepción personalizada basada en el mensaje de excepción original. (Esto se debe a que suds arroja una excepción genérica WebFault, desde cuyo mensaje analizo la excepción lanzada por el servicio web y planteo una excepción de Python para duplicarla).Python: Decorador de excepciones. Cómo conservar stacktrace
Sin embargo, cuando elevo la excepción personalizada en el contenedor, quiere que el stacktrace apunte a la función que generó la excepción original de WebFault. Lo que hasta ahora he planteado es la excepción correcta (analiza dinámicamente el mensaje y crea la clase de excepción). Mi pregunta es: ¿Cómo puedo conservar el stacktrace para apuntar a la función original que generó la excepción 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)
¿Ha mirado el 'traceback' módulo? http://docs.python.org/library/traceback.html – stderr
Al envolver en un decorador use [functools.wrap] (https://docs.python.org/2/library/functools.html) –
posible duplicado de ["Excepción interna" (con traceback) en Python?] (Http://stackoverflow.com/questions/1350671/inner-exception-with-traceback-in-python) –