Maîtriser la gestion d'exceptions Python : try, except, else et finally expliqués
Maîtriser la gestion d'exceptions Python : try, except, else et finally expliqués
Ce guide vous accompagne à travers les constructions de gestion d'exceptions de Python avec des extraits de code pratiques et des conseils de bonnes pratiques.
Vidéo : Gestion des exceptions Python (try..except..finally)
Exceptions en Python
Python lève des exceptions intégrées chaque fois qu'une erreur d'exécution survient. L'interpréteur arrête le bloc de code courant et propage l'exception dans la pile d'appels jusqu'à ce qu'un gestionnaire soit trouvé. S'il n'existe aucun gestionnaire, le programme se termine et affiche une traceback.
Considérez la chaîne d'appels suivante : A appelle B, qui appelle C. Si C lève une exception qui n'est pas gérée localement, l'exception remonte vers B puis vers A. Les exceptions non gérées entraînent un crash brutal du programme.
Intercepter les exceptions en Python
Pour intercepter une exception, placez le code potentiellement dangereux dans un bloc try. La clause except contient la logique qui s'exécute quand une exception survient.
Voici un exemple concis qui démontre le flux :
# Importer le module sys pour inspecter le type d'exception
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("L'entrée est", entry)
r = 1 / int(entry)
break
except:
print("Oups !", sys.exc_info()[0], "s'est produit.")
print("Entrée suivante.")
print()
print("Le réciproque de", entry, "est", r)
Sortie
L'entrée est a Oups ! <class 'ValueError'> s'est produit. Entrée suivante. L'entrée est 0 Oups ! <class 'ZeroDivisionError'> s'est produit. Entrée suivante. L'entrée est 2 Le réciproque de 2 est 0.5
Le code itère sur random_list. Si la conversion en int ou la division échoue, le bloc except gère l'erreur, la journalise et passe à l'élément suivant. Quand une conversion réussie se produit, la boucle s'arrête et le réciproque est affiché.
Puisque toutes les exceptions intégrées héritent de Exception, vous pouvez les intercepter génériquement :
# Importer le module sys pour inspecter le type d'exception
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("L'entrée est", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oups !", e.__class__, "s'est produit.")
print("Entrée suivante.")
print()
print("Le réciproque de", entry, "est", r)
La sortie est identique, mais le gestionnaire référence maintenant la classe d'exception spécifique via e.__class__.
Intercepter des exceptions spécifiques en Python
Intercepter largement toutes les exceptions peut masquer des bugs et rendre le débogage difficile. À la place, listez seulement les types d'exceptions que vous attendez.
Un bloc try peut contenir plusieurs clauses except ; seule la première clause correspondante s'exécute. Exemple :
try:
# code qui peut lever une erreur
pass
except ValueError:
# gérer ValueError
pass
except (TypeError, ZeroDivisionError):
# gérer soit TypeError soit ZeroDivisionError
pass
except Exception:
# repli pour toute autre exception
pass
Lever des exceptions en Python
Au-delà des exceptions automatiques, les développeurs peuvent lever des erreurs explicitement avec l'instruction raise. Optionnellement, passez un message pour clarifier la raison.
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("Ceci est un argument") # Traceback: MemoryError: Ceci est un argument
try:
a = int(input("Entrez un entier positif : "))
if a <= 0:
raise ValueError("Ce n'est pas un nombre positif !")
except ValueError as ve:
print(ve)
Clause else avec try en Python
La clause optionnelle else s'exécute seulement quand le bloc try se termine sans lever d'exception. Ce motif garde le code du chemin de succès séparé de la gestion d'erreur.
Exemple : afficher le réciproque d'un nombre pair.
# programme pour afficher le réciproque de nombres pairs
try:
num = int(input("Entrez un nombre : "))
assert num % 2 == 0
except:
print("Pas un nombre pair !")
else:
reciproque = 1 / num
print(reciproque)
Sortie en entrant un nombre impair :
Entrez un nombre : 1 Pas un nombre pair !
Sortie en entrant un nombre pair :
Entrez un nombre : 4 0.25
Notez que si num est zéro, ZeroDivisionError est levé dans le bloc else et n'est pas intercepté par la clause except précédente.
Python try…finally
La clause finally garantit que le code de nettoyage s'exécute indépendamment de la survenue d'une exception. C'est essentiel lors du travail avec des ressources externes comme les fichiers, connexions réseau ou GUI.
Utilisation typique avec la gestion de fichiers :
try:
f = open("test.txt", encoding='utf-8')
# effectuer des opérations sur le fichier
finally:
f.close()
Le fichier est toujours fermé, même si une erreur survient pendant le traitement.
Python
- Mots-clés et identifiants Python : Maîtriser les mots réservés et les conventions de nommage
- Instructions, indentation et commentaires en Python : Guide clair
- Variables, constantes et littéraux en Python – Guide complet
- Maîtriser la conversion et le transtypage de types en Python : Guide complet
- Maîtriser les E/S et l'importation de modules en Python : Guide pratique
- Maîtriser l'instruction pass en Python : Guide pratique
- Comprendre les variables globales, locales et non locales en Python
- Maîtriser les opérations sur les répertoires et fichiers en Python
- Maîtriser la gestion d'exceptions Python : try, except, else et finally expliqués