13

Decir que tengo un poco de código como este:pitón: recuperar excepción del bloque try, si finalmente el bloque plantea excepción

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "try block failed: %s" % (e,) 

La salida es:

try block failed: in the finally 

Desde el punto de que la declaración de impresión, es ¿Hay alguna manera de acceder a la excepción planteada en el intento, o ha desaparecido para siempre?

NOTA: No tengo un caso de uso en mente; esto es solo curiosidad

Respuesta

14

No puedo encontrar ninguna información sobre si esto se ha portado y no tienen una instalación Py2 útil, pero en Python 3, e tiene un atributo llamado e.__context__, de modo que:

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception as e: 
    print(repr(e.__context__)) 

da :

Exception('in the try',) 

Según PEP 3314, antes de añadir __context__, información sobre la excepción original no estaba disponible.

+0

bueno, pero solo py3. de todos modos: +1. – ch3ka

+1

ah, bien. entonces, según ese PEP, la respuesta es "no se puede, en Py2, pero se puede en Py3". ¡Gracias! – Claudiu

0
try: 
    try: 
     raise Exception("in the try") 
    except Exception, e: 
     print "try block failed" 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "finally block failed: %s" % (e,) 

Sin embargo, sería una buena idea para evitar tener código que es probable que una excepción en el bloque finally - por lo general sólo lo utilizan para hacer la limpieza, etc. todos modos.

+2

Eso solo traga la excepción '" in the try "' antes de llegar al bloque finally. –

Cuestiones relacionadas