Exceptions personnalisées Python
Exceptions personnalisées Python
Dans ce didacticiel, vous apprendrez à définir des exceptions personnalisées en fonction de vos besoins à l'aide d'exemples.
Python a de nombreuses exceptions intégrées qui forcent votre programme à générer une erreur lorsque quelque chose ne va pas dans le programme.
Cependant, vous devrez parfois créer vos propres exceptions personnalisées qui servent votre objectif.
Créer des exceptions personnalisées
En Python, les utilisateurs peuvent définir des exceptions personnalisées en créant une nouvelle classe. Cette classe d'exception doit être dérivée, directement ou indirectement, du Exception
intégré classer. La plupart des exceptions intégrées sont également dérivées de cette classe.
>>> class CustomError(Exception):
... pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred
Ici, nous avons créé une exception définie par l'utilisateur appelée CustomError
qui hérite du Exception
classer. Cette nouvelle exception, comme les autres exceptions, peut être déclenchée à l'aide du raise
déclaration avec un message d'erreur facultatif.
Lorsque nous développons un programme Python volumineux, il est recommandé de placer toutes les exceptions définies par l'utilisateur que notre programme génère dans un fichier séparé. De nombreux modules standard le font. Ils définissent leurs exceptions séparément comme exceptions.py
ou errors.py
(généralement mais pas toujours).
La classe d'exception définie par l'utilisateur peut implémenter tout ce qu'une classe normale peut faire, mais nous les rendons généralement simples et concises. La plupart des implémentations déclarent une classe de base personnalisée et dérivent d'autres classes d'exception de cette classe de base. Ce concept est rendu plus clair dans l'exemple suivant.
Exemple :Exception définie par l'utilisateur en Python
Dans cet exemple, nous allons illustrer comment les exceptions définies par l'utilisateur peuvent être utilisées dans un programme pour générer et intercepter des erreurs.
Ce programme demandera à l'utilisateur d'entrer un nombre jusqu'à ce qu'il devine correctement un nombre stocké. Pour les aider à le comprendre, un indice est fourni si leur estimation est supérieure ou inférieure au nombre stocké.
# define Python user-defined exceptions
class Error(Exception):
"""Base class for other exceptions"""
pass
class ValueTooSmallError(Error):
"""Raised when the input value is too small"""
pass
class ValueTooLargeError(Error):
"""Raised when the input value is too large"""
pass
# you need to guess this number
number = 10
# user guesses a number until he/she gets it right
while True:
try:
i_num = int(input("Enter a number: "))
if i_num < number:
raise ValueTooSmallError
elif i_num > number:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("This value is too small, try again!")
print()
except ValueTooLargeError:
print("This value is too large, try again!")
print()
print("Congratulations! You guessed it correctly.")
Voici un exemple d'exécution de ce programme.
Enter a number: 12 This value is too large, try again! Enter a number: 0 This value is too small, try again! Enter a number: 8 This value is too small, try again! Enter a number: 10 Congratulations! You guessed it correctly.
Nous avons défini une classe de base appelée Error
.
Les deux autres exceptions (ValueTooSmallError
et ValueTooLargeError
) qui sont réellement soulevées par notre programme sont dérivées de cette classe. C'est la manière standard de définir des exceptions définies par l'utilisateur dans la programmation Python, mais vous n'êtes pas limité à cette seule manière.
Personnalisation des classes d'exception
Nous pouvons personnaliser davantage cette classe pour accepter d'autres arguments selon nos besoins.
Pour en savoir plus sur la personnalisation des classes d'exception, vous devez avoir les connaissances de base en programmation orientée objet.
Visitez la programmation orientée objet Python pour commencer à en apprendre davantage sur la programmation orientée objet en Python.
Prenons un exemple :
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Sortie
Enter salary amount: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Ici, nous avons remplacé le constructeur du Exception
class pour accepter nos propres arguments personnalisés salary
et message
. Ensuite, le constructeur du parent Exception
la classe est appelée manuellement avec le self.message
argument utilisant super()
.
Le self.salary
personnalisé l'attribut est défini pour être utilisé ultérieurement.
Le __str__
hérité méthode du Exception
class est alors utilisé pour afficher le message correspondant lorsque SalaryNotInRangeError
est relevé.
Nous pouvons également personnaliser le __str__
méthode elle-même en la remplaçant.
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.salary} -> {self.message}'
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Sortie
Enter salary amount: 2000 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range
Pour en savoir plus sur la façon dont vous pouvez gérer les exceptions dans Python, consultez Python Exception Handling.
Python