How to print the full traceback without halting the program?
Cuando no desea detener su programa por un error, debe manejar ese error con un intento/excepto:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Para extraer el rastreo completo, usaremos el traceback
módulo de la biblioteca estándar:
import traceback
Y para crear un stacktrace decentemente complicado para demostrar que obtenemos el stacktrace completo:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Impresión
Para imprimir el rastreo completo, utilice el traceback.print_exc
método:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Que imprime:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Mejor que imprimir, iniciar sesión:
Sin embargo, una mejor práctica es tener un registrador configurado para su módulo. Sabrá el nombre del módulo y podrá cambiar los niveles (entre otros atributos, como los controladores)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
En cuyo caso, querrá la logger.exception
función en su lugar:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Que registra:
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
O tal vez solo quiera la cadena, en cuyo caso, querrá la traceback.format_exc
función en su lugar:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Que registra:
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Conclusión
Y para las tres opciones, vemos que obtenemos el mismo resultado que cuando tenemos un error:
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
cual usar
Las preocupaciones de rendimiento no son importantes aquí, ya que IO suele dominar. Preferiría, ya que hace precisamente lo que se solicita de una manera compatible con versiones posteriores:
logger.exception(error)
Los niveles de registro y las salidas se pueden ajustar, lo que facilita el apagado sin tocar el código. Y, por lo general, hacer lo que se necesita directamente es la forma más eficiente de hacerlo.