Como imprimir o rastreamento completo sem interromper o programa?
Quando você não deseja interromper seu programa com um erro, você precisa lidar com esse erro com uma tentativa / exceto:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Para extrair o rastreamento completo, usaremos o traceback
módulo da biblioteca padrão:
import traceback
E para criar um stacktrace decentemente complicado para demonstrar que temos o stacktrace completo:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Impressão
Para imprimir o rastreamento completo, use o 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!
Melhor do que imprimir, registrar:
No entanto, uma prática recomendada é ter um criador de logs configurado para o seu módulo. Ele saberá o nome do módulo e poderá alterar os níveis (entre outros atributos, como manipuladores)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
Nesse caso, você desejará a logger.exception
função:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Quais logs:
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!
Ou talvez você queira apenas a string; nesse caso, você desejará a traceback.format_exc
função:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Quais logs:
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!
Conclusão
E para todas as três opções, vemos que obtemos a mesma saída de quando temos um erro:
>>> 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]
impressões<class 'Exception'>
.