Maîtriser les exceptions personnalisées Python : guide pratique
Exceptions personnalisées Python
Dans ce tutoriel, vous apprendrez à définir des exceptions personnalisées adaptées à vos besoins, illustrées avec des exemples pratiques.
Python fournit de nombreuses exceptions intégrées qui signalent des erreurs quand un programme rencontre des conditions inattendues. Cependant, il arrive que les intégrées ne décrivent pas précisément le problème que vous rencontrez. Dans ces cas, vous pouvez créer vos propres types d'exceptions personnalisés pour rendre votre code plus clair et plus facile à maintenir.
Créer des exceptions personnalisées
Définir une exception personnalisée en Python est simple : créez une nouvelle classe qui hérite de la classe intégrée Exception (ou l'une de ses sous-classes). La plupart des exceptions standard dérivent de Exception, donc votre classe personnalisée s'intégrera parfaitement au système de gestion d'erreurs de Python.
> >>> class ErreurPerso(Exception):
... pass
...
>>> raise ErreurPerso
Traceback (most recent call last):
... __main__.ErreurPerso
>>> raise ErreurPerso("Une erreur s'est produite")
Traceback (most recent call last):
... __main__.ErreurPerso: Une erreur s'est produite
Ici, ErreurPerso est une exception définie par l'utilisateur qui hérite de Exception. Elle peut être levée avec raise et un message optionnel. Lors de la construction de grands projets, il est de pratique courante de placer toutes les exceptions personnalisées dans un module dédié (ex. : exceptions.py ou errors.py) pour qu'elles soient faciles à localiser et maintenir.
Exemple : Exception définie par l'utilisateur en Python
Le programme suivant démontre comment les exceptions personnalisées peuvent guider la saisie utilisateur. Il demande répétitivement à l'utilisateur un nombre jusqu'à ce qu'il devine la valeur stockée. Le programme fournit un indice — si la estimation est trop haute ou trop basse — en levant une exception adaptée.
# définir les exceptions Python définies par l'utilisateur
class Erreur(Exception):
"""Classe de base pour les autres exceptions"""
pass
class ValeurTropPetiteErreur(Erreur):
"""Levée quand la valeur d'entrée est trop petite"""
pass
class ValeurTropGrandeErreur(Erreur):
"""Levée quand la valeur d'entrée est trop grande"""
pass
# le nombre cible
nombre = 10
# continuer à demander jusqu'à ce que la devinette soit correcte
while True:
try:
i_nombre = int(input("Entrez un nombre : "))
if i_nombre < nombre:
raise ValeurTropPetiteErreur
elif i_nombre > nombre:
raise ValeurTropGrandeErreur
break
except ValeurTropPetiteErreur:
print("Cette valeur est trop petite, réessayez !")
print()
except ValeurTropGrandeErreur:
print("Cette valeur est trop grande, réessayez !")
print()
print("Félicitations ! Vous avez deviné correctement.")
Exemple d'exécution :
Entrez un nombre : 12 Cette valeur est trop grande, réessayez ! Entrez un nombre : 0 Cette valeur est trop petite, réessayez ! Entrez un nombre : 8 Cette valeur est trop petite, réessayez ! Entrez un nombre : 10 Félicitations ! Vous avez deviné correctement.
Dans cet exemple, la classe de base Erreur fournit un ancêtre commun pour les deux types d'erreurs spécifiques. Cette approche garde la hiérarchie d'exceptions claire et permet d'intercepter toutes les erreurs liées avec une seule clause except Erreur si désiré.
Personnaliser les classes d'exception
Les exceptions personnalisées peuvent aussi stocker des données additionnelles ou présenter des messages plus informatifs. Cela nécessite de surcharger __init__ et optionnellement __str__. Ce qui suit illustre un scénario de validation de salaire.
class SalaireHorsPlageErreur(Exception):
"""Exception levée pour les erreurs dans le salaire d'entrée.
Attributs:
salaire -- salaire d'entrée qui a causé l'erreur
message -- explication de l'erreur
"""
def __init__(self, salaire, message="Le salaire n'est pas dans l'intervalle (5000, 15000)"):
self.salaire = salaire
self.message = message
super().__init__(self.message)
salaire = int(input("Entrez le montant du salaire : "))
if not 5000 < salaire < 15000:
raise SalaireHorsPlageErreur(salaire)
Sortie
Entrez le montant du salaire : 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaireHorsPlageErreur(salaire) __main__.SalaireHorsPlageErreur: Le salaire n'est pas dans l'intervalle (5000, 15000)
En surchargeant __init__, l'exception peut transporter la valeur en cause. Si vous voulez une représentation en chaîne personnalisée, surchargez __str__ comme montré ci-dessous :
class SalaireHorsPlageErreur(Exception):
"""Exception levée pour les erreurs dans le salaire d'entrée.
Attributs:
salaire -- salaire d'entrée qui a causé l'erreur
message -- explication de l'erreur
"""
def __init__(self, salaire, message="Le salaire n'est pas dans l'intervalle (5000, 15000)"):
self.salaire = salaire
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.salaire} → {self.message}'
salaire = int(input("Entrez le montant du salaire : "))
if not 5000 < salaire < 15000:
raise SalaireHorsPlageErreur(salaire)
Sortie
Entrez le montant du salaire : 2000 Traceback (most recent call last): File "/home/user/untitled.py", line 20, in <module> raise SalaireHorsPlageErreur(salaire) __main__.SalaireHorsPlageErreur: 2000 → Le salaire n'est pas dans l'intervalle (5000, 15000)
Pour une exploration plus approfondie des motifs de gestion d'exceptions, consultez le tutoriel Gestion d'exceptions Python.
Pour en savoir plus sur la conception d'applications robustes, explorez Programmation orientée objet Python.
Python
- Maîtriser les types de données Python : Guide pratique
- Maîtriser les opérateurs Python : Guide complet
- Maîtriser l'instruction pass en Python : Guide pratique
- Maîtriser les arguments de fonctions Python : Positionnels, nommés et paramètres par défaut
- Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
- Maîtriser les erreurs et exceptions intégrées de Python
- Maîtriser la programmation orientée objet Python : classes, héritage, encapsulation et polymorphisme
- Maîtriser l'héritage Python : concepts, syntaxe et exemples pratiques
- Maîtriser les itérateurs Python : fonctionnement et création des vôtres