try - ¿Cómo obtener el último objeto de excepción después de que se genera un error en un aviso de Python?
try except anidados python (2)
Como mencionó @Cairnarvon, no encontré ningún miembro last_value
es el módulo sys.
sys.exc_info()
hizo el truco para mí. sys.exc_info()
devuelve una tupla con tres valores (type, value, traceback)
.
Entonces sys.exc_info()[1]
dará el error legible. Aquí está el ejemplo,
import sys
list = [1,2,3,4]
try:
del list[8]
except Exception:
print(sys.exc_info()[1])
mostrará el list assignment index out of range
salida list assignment index out of range
Además, traceback.format_exc()
del módulo de traceback
se puede utilizar para imprimir la información similar.
A continuación se muestra el resultado si se usa fortmat_exec()
,
Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range
Al depurar el código de Python en el indicador interactivo (REPL), a menudo escribo algún código que genera una excepción, pero no lo he envuelto en una try
/ except
, así que una vez que se produce el error, he perdido para siempre el objeto de excepción
A menudo, el rastreo y el mensaje de error que Python imprime no es suficiente. Por ejemplo, cuando recupera una URL, el servidor puede devolver un error de 40x y necesita el contenido de la respuesta a través de error.read()
... pero ya no tiene el objeto de error. Por ejemplo:
>>> import urllib2
>>> f = urllib2.urlopen(''http://example.com/api/?foo=bad-query-string'')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
urllib2.HTTPError: HTTP Error 400: Bad Request
Drat, ¿qué dijo el cuerpo de la respuesta? Probablemente tenía información de error valiosa en él ...
Me doy cuenta de que, por lo general, es fácil volver a ejecutar el código en una prueba / excepción, pero eso no es lo ideal. También me doy cuenta de que en este caso específico si estuviera usando la biblioteca de requests
(que no genera errores de HTTP), no tendría este problema ... pero realmente me pregunto si hay una forma más general de obtener el último objeto de excepción en un aviso de Python en estos casos.
El módulo sys
proporciona algunas funciones para el examen post-hoc de excepciones: sys.last_type
, sys.last_value
y sys.last_traceback
.
sys.last_value
es el que está buscando.