Vamos 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()
Registrando o StackTrace Completo
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__)
E podemos usar esse logger para obter o erro:
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!
E assim obtemos a mesma saída que 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!
Obtendo apenas a string
Se você realmente deseja apenas a string, use a traceback.format_exc
função, demonstrando o registro da string aqui:
import traceback
try:
do_something_that_might_error()
except Exception as error:
just_the_string = traceback.format_exc()
logger.debug(just_the_string)
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!
log_error(err)
função.