Come stampare il traceback completo senza arrestare il programma?
Quando non si desidera arrestare il programma in caso di errore, è necessario gestirlo con un tentativo / tranne:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Per estrarre il traceback completo, useremo il traceback
modulo dalla libreria standard:
import traceback
E per creare uno stacktrace abbastanza complicato per dimostrare che otteniamo l'intero stacktrace:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Stampa
Per stampare il traceback completo, utilizzare il traceback.print_exc
metodo:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Che stampa:
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!
Meglio che stampare, registrare:
Tuttavia, è consigliabile disporre di un logger impostato per il 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__)
In tal caso, ti consigliamo logger.exception
invece la funzione:
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!
O forse vuoi solo la stringa, nel qual caso, preferirai traceback.format_exc
invece la funzione:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
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!
Conclusione
E per tutte e tre le opzioni, vediamo che abbiamo 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!
print(sys.exc_info()[0]
stampe<class 'Exception'>
.