Maison  >  Article  >  développement back-end  >  Comment enregistrer les exceptions non interceptées en Python ?

Comment enregistrer les exceptions non interceptées en Python ?

DDD
DDDoriginal
2024-10-22 23:54:29843parcourir

How to Log Uncaught Exceptions in Python?

Consignation des exceptions non interceptées en Python

Lorsqu'une exception se produit dans un programme Python et n'est pas gérée dans le bloc d'exécution actuel, elle est automatiquement imprimé avec l'erreur standard (stderr). Ce comportement peut être gênant, en particulier lorsque vous souhaitez capturer toutes les exceptions à des fins de journalisation ou de débogage.

Pour résoudre ce problème, vous pouvez configurer le module de journalisation pour qu'il génère automatiquement les exceptions non interceptées. Voici une solution qui exploite la fonction logging.exception() :

<code class="python">try:
    raise Exception('Throwing a boring exception')
except Exception as e:
    logging.exception(e)</code>

Cette approche est efficace, mais nécessite de gérer et de consigner explicitement chaque exception. Pour une solution plus automatisée, vous pouvez remplacer la fonction sys.saufhook de Python, qui est responsable de la gestion des exceptions non interceptées.

Vous trouverez ci-dessous un exemple de configuration de journalisation complète qui inclut des fonctionnalités supplémentaires telles que :

  • Ignorer les événements d'interruption du clavier (Ctrl C) pour permettre une sortie gracieuse du programme
  • Utiliser les capacités de formatage du module de journalisation pour le rapport d'exceptions
  • Sortir les exceptions non gérées vers stdout au lieu de stderr
<code class="python">import sys
import logging

logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

def handle_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return

    logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_exception

if __name__ == "__main__":
    raise RuntimeError("Test unhandled")</code>

Avec cette configuration en place, toutes les exceptions non interceptées seront automatiquement enregistrées par le module de journalisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn