¿Cómo imprimir el rastreo completo sin detener el programa?
Cuando no desee 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, use 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. Conocerá 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)
Qué registros:
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 desee 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())
Qué registros:
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!
print(sys.exc_info()[0]
impresiones<class 'Exception'>
.