Tengo una cláusula try
/finally
en mi script. ¿Es posible obtener el mensaje de error exacto dentro de la cláusula finally
?¿Puedo obtener la excepción del bloque finally en python?
Respuesta
No, al tiempo finally
sys.exc_info
es todo-nada, si se ha producido una excepción o no. Uso: se ejecutará
try:
whatever
except:
here sys.exc_info is valid
to re-raise the exception, use a bare `raise`
else:
here you know there was no exception
finally:
and here you can do exception-independent finalization
Querrá hacer eso en la cláusula except, no en el final.
Consulte: http://www.doughellmann.com/articles/Python-Exception-Handling/
El bloque finally
independientemente de si ha generado una excepción o no, así como señala Josh, es muy probable que no quiere estar manejando allí.
Si realmente necesita el valor de una excepción que se planteó, entonces debe detectar la excepción en un bloque except
, y manejarla apropiadamente o volver a subirla, y luego usar ese valor en el bloque finally - - con la expectativa de que nunca se haya establecido, si no se planteó ninguna excepción durante la ejecución.
import sys
exception_name = exception_value = None
try:
# do stuff
except Exception, e:
exception_name, exception_value = sys.exc_info()[:2]
raise # or don't -- it's up to you
finally:
# do something with exception_name and exception_value
# but remember that they might still be none
En realidad, otras respuestas son un poco vagas. Por lo tanto, déjame aclararlo. Siempre puede invocar sys.exc_info() desde el bloque finally. Sin embargo, su salida variará dependiendo de si la excepción ha sido realmente levantada.
import sys
def f(i):
try:
if i == 1:
raise Exception
except Exception as e:
print "except -> " + str(sys.exc_info())
finally:
print "finally -> " + str(sys.exc_info())
f(0)
f(1)
>>>
finally -> (None, None, None)
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>)
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>)
Por lo tanto, siempre es posible saber en bloque finally, si se eleva la excepción, si se trata de la primera función de nivel. Pero sys.exc_info() se comportará de manera diferente cuando la duración de la pila de llamadas excede de 1, como se muestra en el ejemplo siguiente. Para obtener más información, consulte How sys.exc_info() works?
import sys
def f(i):
try:
if i == 1:
raise Exception
except Exception as e:
print "except -> " + str(sys.exc_info())
finally:
print "finally -> " + str(sys.exc_info())
def f1(i):
if i == 0:
try:
raise Exception('abc')
except Exception as e:
pass
f(i)
f1(0)
f1(1)
>>>
finally -> (<type 'exceptions.Exception'>, Exception('abc',), <traceback object at 0x02A33940>)
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>)
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>)
espero, que hace las cosas poco más claro.
Esto es cierto solo para python2. – coldfix
@coldfix ¿Quisiste decir que esto solo es cierto para python3? –
No, ejecuto el script en python2 y python3. En python3 (después de solucionar problemas sintácticos menores), la salida para 'f (1)' es 'finally -> (None, None, None)', por lo que no puede obtener la excepción en el bloque finally tan fácil. – coldfix
apenas define una variable en blanco para posible excepción antes del bloque try
except
:
import sys
exception = None
try:
result = 1/0
except ZeroDivisionError as e:
exception = sys.exc_info() # or "e"
finally:
if exception:
print(exception)
else:
print('Everything is fine')
probado en Python 3.6
- 1. Detectar excepción en el bloque finally
- 2. Excepción desde dentro de un bloque finally
- 3. ¿Cuál es el punto del bloque finally?
- 4. ¿Qué sucede si un bloque finally arroja una excepción?
- 5. ¿Cuál es la esencia del bloque finally en Java?
- 6. En un bloque finally, puedo saber si una excepción ha sido lanzada
- 7. ¿Realmente necesita el bloque 'finally'
- 8. pitón: recuperar excepción del bloque try, si finalmente el bloque plantea excepción
- 9. ¿Cómo puedo detectar una ThreadAbortException en un bloque finally? (.NET)
- 10. pasa a la pregunta/bloque finally
- 11. python try-finally
- 12. Will Try/Finally (sin la captura) ¿burbuja la excepción?
- 13. Obteniendo referencia a una excepción en el bloque finally en un iterador
- 14. Cerrar archivo en bloque finally no funciona
- 15. Lanzar excepción en try bloque
- 16. Utilice un bloque 'try-finally' sin un bloque 'catch'
- 17. ¿Cómo puedo determinar la excepción actual en un bloque catch (...)?
- 18. ¿El bloque C# "finally" SIEMPRE se ejecuta?
- 19. usando Python "con" declaración con excepción try-bloque
- 20. ¿Por qué necesitamos la cláusula "finally" en Python?
- 21. ¿Qué sucede con el valor devuelto después de que se lanza la excepción en el bloque finally?
- 22. ¿Cómo puedo obtener la salida del terminal en python?
- 23. Obtener el valor de la excepción en Python
- 24. Descripción del libro obsoleta de la declaración Try-Except-Finally
- 25. ¿Debería poner un bloque try-finally después de cada Object.Create?
- 26. Obteniendo la traza inversa del bloque catch
- 27. bloque en Python
- 28. ¿Por qué usar try {} finally {} con un bloque try vacío?
- 29. ¿Existe la posibilidad de que un bloque finally no se ejecute?
- 30. python try/finally para control de flujo
Gracias. sys.exc_info (en una cláusula except) es lo que necesito – Goutham
A partir de Python 3.?, puede acceder a 'sys.exc_info' dentro del bloque' finally: '. – Kentzo
@Kentzo Acabo de probarlo en Python 3.6. 'sys.exc_info()' returns '(None, None, None)' en el bloque finally cuando generó una excepción. – Jonathan