Creiamo uno stacktrace abbastanza complicato, al fine di dimostrare che otteniamo l'intero stacktrace:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Registrazione dell'intero stack stack
Una buona pratica è quella di avere un logger impostato per il tuo modulo. Conoscerà il nome del modulo e sarà in grado di cambiare i livelli (tra gli altri attributi, come i gestori)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
E possiamo usare questo logger per ottenere l'errore:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Quali registri:
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 così otteniamo lo stesso output di quando abbiamo un errore:
>>> 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!
Ottenere solo la stringa
Se vuoi davvero solo la stringa, usa traceback.format_exc
invece la funzione, dimostrando la registrazione della stringa qui:
import traceback
try:
do_something_that_might_error()
except Exception as error:
just_the_string = traceback.format_exc()
logger.debug(just_the_string)
Quali registri:
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)
funzione.