2009-12-11 18 views
8

Estoy construyendo una herramienta donde, a medida que las excepciones se propagan hacia arriba, se agregan nuevos datos sobre el contexto de la excepción a la excepción. El problema es que, cuando la excepción llega al nivel superior, todos los datos de contexto adicionales están allí, pero solo se muestra el último seguimiento de la pila. ¿Hay una manera fácil de tener una excepción para mostrar el rastro original de la pila en el que se lanzó en lugar del último rastro de la pila, o debo hacer algo así como tomar el rastro original de la pila la primera vez que se propaga la excepción?Propagación de excepción Python

Por ejemplo, el siguiente código:

def a(): 
    return UNBOUND 
def b(): 
    try: 
     a() 
    except Exception as e: 
     raise e 
b() 

produce la siguiente excepción:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    b() 
    File "test.py", line 7, in b 
    raise e 
NameError: global name 'UNBOUND' is not defined 

donde, a ser posible, me gustaría mostrar alguna manera el usuario esto:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    File "test.py", line 2, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Lo que indica al usuario la línea en la que se produjo el error originalmente.

Respuesta

26

Las excepciones de Python son un poco como java, hay una manera de hacer que la excepción se vuelva a lanzar sin truncar la pila.

Simplemente use raise sin un argumento. El resultado es:

Traceback (most recent call last): 
    File "./exc.py", line 11, in <module> 
    b() 
    File "./exc.py", line 7, in b 
    a() 
    File "./exc.py", line 4, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Puede modificar algunas cosas sobre el objeto e, incluso si sólo raise sin que el argumento - por ejemplo:

e.args = ("hi!",) 
raise 

realmente va a cambiar el mensaje de excepción. Probablemente también pueda cambiar las otras opciones de esta manera, sin destruir la pila.

Cuestiones relacionadas