Comment imprimer la trace complète sans arrêter le programme?
Lorsque vous ne voulez pas arrêter votre programme en cas d'erreur, vous devez gérer cette erreur avec un essai / sauf:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Pour extraire la trace complète, nous utiliserons le traceback
module de la bibliothèque standard:
import traceback
Et pour créer un stacktrace décemment compliqué pour démontrer que nous obtenons le stacktrace complet:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Impression
Pour imprimer la trace complète, utilisez la traceback.print_exc
méthode:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Qui 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!
Mieux que l'impression, la journalisation:
Cependant, une meilleure pratique consiste à configurer un enregistreur pour votre module. Il connaîtra le nom du module et pourra changer de niveau (entre autres attributs, comme les gestionnaires)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
Dans ce cas, vous voudrez logger.exception
plutôt la fonction:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Quels journaux:
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 peut-être que vous voulez juste la chaîne, auquel cas, vous voudrez traceback.format_exc
plutôt la fonction:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Quels journaux:
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!
Conclusion
Et pour les trois options, nous voyons que nous obtenons la même sortie que lorsque nous avons une erreur:
>>> 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]
impressions<class 'Exception'>
.