Numérique et Sciences Informatiques > Langages de Programmation > Gestion des Erreurs et Exceptions > Gestion des exceptions (try, except)

Gestion des exceptions en Python : try, except

Comprendre et utiliser les blocs try et except pour gérer les erreurs en Python. Apprenez à anticiper et à traiter les exceptions pour rendre vos programmes plus robustes et fiables.

Introduction à la gestion des exceptions

La gestion des exceptions est un aspect crucial de la programmation qui permet d'anticiper et de traiter les erreurs potentielles qui peuvent survenir lors de l'exécution d'un programme. Sans gestion des exceptions, une erreur non gérée peut provoquer l'arrêt brutal du programme, ce qui est indésirable. En Python, nous utilisons les blocs try et except pour gérer ces exceptions de manière élégante.

Le bloc try : surveiller le code potentiellement problématique

Le bloc try contient le code qui pourrait potentiellement lever une exception. Il s'agit d'une zone de surveillance. Si une erreur se produit à l'intérieur de ce bloc, l'exécution est immédiatement transférée au bloc except correspondant.

Le bloc except : attraper et gérer les exceptions

Le bloc except suit le bloc try et contient le code qui sera exécuté si une exception spécifique est levée dans le bloc try. On peut spécifier le type d'exception que l'on souhaite attraper. Si l'exception levée correspond au type spécifié dans le bloc except, le code à l'intérieur de ce bloc est exécuté. S'il ne correspond pas, l'exception est propagée vers le haut, à la recherche d'un autre gestionnaire except ou, en l'absence de celui-ci, provoque l'arrêt du programme.

Exemple simple : division par zéro

Voici un exemple classique de gestion d'exception : la division par zéro. Diviser un nombre par zéro est une opération non définie et lève une exception ZeroDivisionError en Python.

def division(a, b): try: resultat = a / b print("Le résultat est :", resultat) except ZeroDivisionError: print("Erreur : division par zéro impossible.") # Exemples d'utilisation division(10, 2) # Affiche : Le résultat est : 5.0 division(10, 0) # Affiche : Erreur : division par zéro impossible. Dans cet exemple, si b est égal à zéro, l'exception ZeroDivisionError est levée, et le message d'erreur est affiché au lieu de provoquer une erreur fatale.

Gestion de plusieurs types d'exceptions

Il est possible de gérer plusieurs types d'exceptions en utilisant plusieurs blocs except. Cela permet de traiter différentes erreurs de manière spécifique.

def traiter_fichier(nom_fichier): try: fichier = open(nom_fichier, 'r') contenu = fichier.read() # Supposons que le contenu doit être converti en entier nombre = int(contenu) print("Le nombre est :", nombre) except FileNotFoundError: print("Erreur : Fichier non trouvé.") except ValueError: print("Erreur : Le contenu du fichier n'est pas un nombre valide.") except Exception as e: print("Une erreur inattendue s'est produite :", e) finally: if 'fichier' in locals() and fichier: fichier.close() Ici, on gère FileNotFoundError si le fichier n'existe pas, ValueError si le contenu du fichier ne peut pas être converti en entier, et une exception générique Exception pour toute autre erreur inattendue. Le bloc finally assure que le fichier est toujours fermé, même en cas d'erreur.

Le bloc else

Un bloc else peut être ajouté après les blocs except. Le code dans le bloc else est exécuté si aucune exception n'est levée dans le bloc try. C'est utile pour exécuter du code qui dépend du succès des opérations dans le bloc try.

def division_else(a, b): try: resultat = a / b except ZeroDivisionError: print("Erreur : division par zéro impossible.") else: print("Le résultat est :", resultat) Dans cet exemple, le résultat de la division n'est affiché que si aucune ZeroDivisionError n'est levée.

Le bloc finally

Le bloc finally est exécuté toujours, qu'une exception soit levée ou non. Il est généralement utilisé pour effectuer des opérations de nettoyage, comme fermer un fichier ou libérer des ressources.

def exemple_finally(): try: fichier = open('mon_fichier.txt', 'w') fichier.write('Hello, world!') except IOError: print("Erreur : Impossible d'écrire dans le fichier.") finally: if 'fichier' in locals() and fichier: fichier.close() print("Fichier fermé.") Ici, le fichier est fermé dans le bloc finally, garantissant qu'il est fermé même si une exception IOError est levée lors de l'écriture.

Lever une exception manuellement : raise

Il est possible de lever une exception manuellement en utilisant le mot-clé raise. Cela peut être utile pour signaler des conditions d'erreur spécifiques.

def verifier_age(age): if age < 0: raise ValueError("L'âge ne peut pas être négatif.") elif age > 150: raise ValueError("L'âge semble incorrect.") else: print("Âge valide.") # Exemple d'utilisation try: verifier_age(-5) except ValueError as e: print("Erreur :", e) Dans cet exemple, la fonction verifier_age lève une exception ValueError si l'âge est négatif ou supérieur à 150.

Ce qu'il faut retenir

  • La gestion des exceptions permet d'anticiper et de traiter les erreurs qui peuvent survenir lors de l'exécution d'un programme.
  • Les blocs try et except sont utilisés pour encadrer le code susceptible de lever une exception et pour la gérer.
  • Le bloc try contient le code à surveiller.
  • Le bloc except contient le code à exécuter si une exception spécifique est levée dans le bloc try.
  • Il est possible de gérer plusieurs types d'exceptions en utilisant plusieurs blocs except.
  • Le bloc else est exécuté si aucune exception n'est levée dans le bloc try.
  • Le bloc finally est toujours exécuté, qu'une exception soit levée ou non, et est utilisé pour effectuer des opérations de nettoyage.
  • Le mot-clé raise permet de lever une exception manuellement.

FAQ

  • Quelle est la différence entre une erreur de syntaxe et une exception ?

    Une erreur de syntaxe est détectée par l'interpréteur Python avant l'exécution du programme, car elle viole les règles de grammaire du langage. Une exception, en revanche, se produit pendant l'exécution du programme, lorsque quelque chose d'inattendu se produit (par exemple, une division par zéro ou une tentative d'accès à un fichier qui n'existe pas).
  • Est-il possible d'avoir un bloc try sans bloc except ?

    Non, un bloc try doit être suivi d'au moins un bloc except ou un bloc finally. S'il n'y a pas de bloc except, le bloc finally doit être présent pour garantir que le code de nettoyage est exécuté.
  • Comment savoir quel type d'exception attraper ?

    Il est important de connaître les types d'exceptions que les différentes opérations peuvent lever. La documentation Python fournit des informations détaillées sur les exceptions standard. On peut aussi utiliser un bloc except Exception as e: pour attraper toutes les exceptions et examiner l'objet e pour déterminer le type d'exception levée. Cependant, il est préférable d'attraper des exceptions spécifiques lorsque cela est possible, pour une gestion plus précise des erreurs.