He visto muchas publicaciones sobre seguimiento de pila y excepciones en Python. Pero no he encontrado lo que necesito.
Tengo un fragmento de código Python 2.7 que puede generar una excepción. Me gustaría atraparlo y asignar a una cadena su descripción completa y el seguimiento de la pila que causó el error (simplemente todo lo que usamos para ver en la consola). Necesito esta cadena para imprimirla en un cuadro de texto en la GUI.
Algo como esto:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
El problema es: ¿cuál es la función complete_exception_description
?
log_error(err)
función.Creemos un seguimiento de pila bastante complicado, para demostrar que obtenemos el seguimiento de pila completo:
Registrar el seguimiento completo de la pila
Una práctica recomendada es tener un registrador configurado para su módulo. Conocerá el nombre del módulo y podrá cambiar los niveles (entre otros atributos, como los controladores)
Y podemos usar este registrador para obtener el error:
Qué registros:
Y así obtenemos el mismo resultado que cuando tenemos un error:
Obteniendo solo la cuerda
Si realmente solo desea la cadena, use la
traceback.format_exc
función en su lugar, demostrando registrar la cadena aquí:Qué registros:
fuente
except Exception as e: logger.exception("<<clearly and distinctly describe what failed here>>", exc_info=e)
exc_info
argumento espera una "tupla de excepción" mientras queerror
es una instancia delException
objeto (o subclase), y no hay necesidad de cambiarerror
ae
.Con Python 3, el siguiente código formateará un
Exception
objeto exactamente como se obtendría usandotraceback.format_exc()
:La ventaja es que solo
Exception
se necesita el objeto (gracias al__traceback__
atributo registrado ) y, por lo tanto, se puede pasar más fácilmente como argumento a otra función para su posterior procesamiento.fuente
.__traceback__
ytype
, consulte stackoverflow.com/a/58764987/5717886Utiliza sys.exc_info () para recopilar la información y las funciones en el
traceback
módulo para formatearla. Aquí hay algunos ejemplos para formatearlo.Toda la cadena de excepción está en:
fuente
Para aquellos que usan Python-3
Usando el
traceback
módulo yexception.__traceback__
uno puede extraer el seguimiento de la pila de la siguiente manera:traceback.extract_stack()
__traceback__
desde el objeto de excepción usandotraceback.extract_tb()
traceback.format_list()
Una simple demostración:
Obtenemos el siguiente resultado cuando llamamos
bar()
:fuente
También puede considerar usar el módulo Python incorporado , cgitb , para obtener información de excepciones realmente buena y bien formateada, incluidos valores de variables locales, contexto de código fuente, parámetros de función, etc.
Por ejemplo para este código ...
obtenemos esta salida de excepción ...
fuente
Si desea obtener la misma información dada cuando no se maneja una excepción, puede hacer algo como esto. Hacer
import traceback
y luego:Estoy usando Python 3.7.
fuente
Para Python 3.5+ :
Por lo tanto, puede obtener el stacktrace de su excepción como de cualquier otra excepción. Úselo
traceback.TracebackException
(solo reemplaceex
con su excepción):Un ejemplo extendido y otras características para hacer esto:
La salida será algo como esto:
fuente
mis 2 centavos:
fuente
Si su objetivo es hacer que el mensaje de excepción y stacktrace se vea exactamente como cuando Python arroja un error, lo siguiente funciona tanto en Python 2 + 3:
Funciona al eliminar la última
format_stacktrace()
llamada de la pila y unir el resto. Cuando se ejecuta, el ejemplo anterior da el siguiente resultado:fuente
Definí la siguiente clase auxiliar:
Que luego puedo usar así:
Y luego puede consumirlo así:
(Antecedentes: estaba frustrado por usar
Promise
s junto conException
s, que desafortunadamente pasa las excepciones planteadas en un lugar a un controlador on_rejected en otro lugar, y por lo tanto es difícil obtener el rastreo desde la ubicación original)fuente