Comment enregistrer les exceptions non interceptées en Python ?

DDD
Libérer: 2024-10-22 23:54:29
original
842 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!