2012-08-31 9 views
7

Tengo una situación en la que estoy captura de un tipo de excepción específica, inspeccionando el mensaje de excepción para comprobar si en realidad es una excepción quiero coger, y luego volver a lanzar la excepción si no:En Python, ¿cómo inspecciono y luego vuelvo a levantar una excepción mientras mantengo la pila de llamadas original?

try: 
    # do something exception-prone 
except FooException as e: 
    if e.message == 'Something I want to handle': 
     # handle the exception 
    else: 
     raise e 

Esto funciona bien, con un problema. En el caso de que vuelva a plantear la excepción, esa excepción ahora se produce en la línea que realicé de nuevo (es decir, en raise e), en lugar de en la ubicación donde se produjo originalmente la excepción. Esto no es ideal para la depuración, donde desea saber dónde ocurrió la excepción original.

Por lo tanto, mi pregunta: ¿hay alguna manera de volver a subir o de otra manera "pasar" una excepción después de atraparla mientras se mantiene la ubicación original de la excepción?

NOTA: En caso de que se esté preguntando cuál es la situación real: Importe dinámicamente algunos módulos usando __import__. Estoy atrapando ImportError para tratar con gracia el caso de que ninguno de estos módulos exista. Sin embargo, en el caso de que alguno de estos módulos contenga una declaración de importación que aumente ImportError, quiero que se generen esas excepciones "reales" (desde el punto de vista de mi aplicación) y en la ubicación original en cuanto a la depuración. herramientas están preocupadas.

Respuesta

7

Just Do:

raise 

en lugar de raise e. Vea la sección de tutorial sobre raising exceptions, y también el language reference on raise statements:

Si no hay expresiones están presentes, aumentar la re-plantea la última excepción que estaba activa en el ámbito actual. Si no hay excepciones activas en el ámbito actual, se genera una excepción TypeError que indica que se trata de un error (si se ejecuta en IDLE, se genera una excepción Queue.Empty en su lugar).

+0

Duh! Fácil. Estaba buscando la referencia para try/except y olvidé mirar raise. Gracias. – Ghopper21

Cuestiones relacionadas