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
try
et except
sont utilisés pour encadrer le code susceptible de lever une exception et pour la gérer.try
contient le code à surveiller.except
contient le code à exécuter si une exception spécifique est levée dans le bloc try
.except
.else
est exécuté si aucune exception n'est levée dans le bloc try
.finally
est toujours exécuté, qu'une exception soit levée ou non, et est utilisé pour effectuer des opérations de nettoyage.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 blocexcept
?
Non, un bloctry
doit être suivi d'au moins un blocexcept
ou un blocfinally
. S'il n'y a pas de blocexcept
, le blocfinally
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 blocexcept Exception as e:
pour attraper toutes les exceptions et examiner l'objete
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.