Maison >développement back-end >Tutoriel Python >Comment implémenter la gestion personnalisée des exceptions avec le module de journalisation de Python ?

Comment implémenter la gestion personnalisée des exceptions avec le module de journalisation de Python ?

DDD
DDDoriginal
2024-10-22 22:46:03518parcourir

How to Implement Custom Exception Handling with Python's Logging Module?

Gestion personnalisée des erreurs avec le module de journalisation de Python

S'assurer que les exceptions non interceptées sont correctement gérées et enregistrées peut être crucial pour le dépannage et le maintien de la stabilité de une application Python. Bien que la détection et la journalisation manuelles des exceptions soient une approche viable, elle peut être fastidieuse et sujette aux erreurs.

Pour résoudre ce problème, Python vous permet de remplacer le mécanisme de gestion des exceptions par défaut et de rediriger les exceptions non interceptées vers le module de journalisation. Cela fournit un moyen pratique et systématique de capturer et d'enregistrer des informations détaillées sur les exceptions.

Solution

Le problème présenté peut être résolu en modifiant la fonction globale sys.saufhook. En définissant un gestionnaire d'exceptions personnalisé, vous pouvez intercepter toutes les exceptions non interceptées et les gérer comme vous le souhaitez. Voici un exemple complet et robuste :

<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):
    # Ignore KeyboardInterrupt so the application can exit with Ctrl + C
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return

    # Log the uncaught exception
    logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_exception

# Example code to test the custom exception handling
if __name__ == "__main__":
    raise RuntimeError("Test unhandled")</code>

Explication

Ce code :

  • Définit un gestionnaire d'exceptions personnalisé, handle_exception, qui est invoqué lorsqu'une exception non interceptée se produit.
  • Ignore KeyboardInterrupt (Ctrl C) pour permettre à l'application de se fermer correctement.
  • Enregistre l'exception non interceptée à l'aide de la méthode error() du module de journalisation.
  • Attache le gestionnaire d'exceptions personnalisé à la fonction sys.exceptionhook.
  • Lève une erreur d'exécution pour démontrer la gestion personnalisée des erreurs.

Lorsqu'une exception non interceptée est déclenchée, le gestionnaire d'exceptions personnalisé Le gestionnaire d'exceptions intervient et enregistre les détails de l'exception dans le gestionnaire configuré. Dans ce cas, le gestionnaire de flux par défaut est utilisé pour afficher les informations d'exception sur la sortie standard.

Fonctionnalités supplémentaires

L'exemple comprend également quelques fonctionnalités facultatives :

  • Filtrage : Ignorez certains types d'exceptions (par exemple, KeyboardInterrupt) en utilisant la vérification des sous-classes.
  • Personnalisation : Modifiez le gestionnaire de journalisation ou utilisez plusieurs gestionnaires pour contrôler le format de sortie et la destination des journaux d'exceptions.

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