În acest tutorial, veți afla cum să definiți excepții personalizate în funcție de cerințele dvs., cu ajutorul exemplelor.
Python are numeroase excepții încorporate care forțează programul să afișeze o eroare atunci când ceva din program nu merge bine.
Cu toate acestea, uneori poate fi necesar să vă creați propriile excepții personalizate care vă servesc scopului.
Crearea de excepții personalizate
În Python, utilizatorii pot defini excepții personalizate prin crearea unei clase noi. Această clasă de excepție trebuie derivată, direct sau indirect, din Exception
clasa încorporată . Majoritatea excepțiilor încorporate sunt, de asemenea, derivate din această clasă.
>>> 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
Aici, am creat o excepție definită de utilizator numită CustomError
care moștenește de la Exception
clasă. Această nouă excepție, ca și alte excepții, poate fi ridicată folosind raise
instrucțiunea cu un mesaj de eroare opțional.
Când dezvoltăm un program Python mare, este o bună practică să plasăm toate excepțiile definite de utilizator pe care programul nostru le ridică într-un fișier separat. Multe module standard fac acest lucru. Ele își definesc excepțiile separat ca exceptions.py
sau errors.py
(în general, dar nu întotdeauna).
Clasa de excepție definită de utilizator poate implementa tot ceea ce poate face o clasă normală, dar în general le facem simple și concise. Majoritatea implementărilor declară o clasă de bază personalizată și derivă alte clase de excepție din această clasă de bază. Acest concept este clarificat în exemplul următor.
Exemplu: Excepție definită de utilizator în Python
În acest exemplu, vom ilustra modul în care excepțiile definite de utilizator pot fi utilizate într-un program pentru a ridica și a detecta erorile.
Acest program va cere utilizatorului să introducă un număr până când va ghici corect un număr stocat. Pentru a-i ajuta să-și dea seama, se oferă un indiciu dacă presupunerea lor este mai mare sau mai mică decât numărul stocat.
# 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 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.")
Iată un exemplu de rulare a acestui program.
Introduceți un număr: 12 Această valoare este prea mare, încercați din nou! Introduceți un număr: 0 Această valoare este prea mică, încercați din nou! Introduceți un număr: 8 Această valoare este prea mică, încercați din nou! Introduceți un număr: 10 Felicitări! Ai ghicit corect.
Am definit o clasă de bază numită Error
.
Celelalte două excepții ( ValueTooSmallError
și ValueTooLargeError
) care sunt de fapt ridicate de programul nostru sunt derivate din această clasă. Acesta este modul standard de a defini excepțiile definite de utilizator în programarea Python, dar nu vă limitați doar la acest mod.
Personalizarea claselor de excepții
Putem personaliza în continuare această clasă pentru a accepta alte argumente conform nevoilor noastre.
Pentru a afla despre personalizarea claselor Exception, trebuie să aveți cunoștințele de bază despre programarea orientată pe obiecte.
Vizitați Python Object Orientation Programming pentru a începe să aflați despre programarea orientată pe obiecte în Python.
Să vedem un exemplu:
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)
Ieșire
Introduceți suma salariului: 2000 Traceback (ultimul apel cel mai recent): Fișierul "", linia 17, în creștere SalaryNotInRangeError (salariu) __principal __. SalaryNotInRangeError: Salariul nu se află în intervalul (5000, 15000)
Aici, am înlocuit constructorul Exception
clasei pentru a accepta propriile noastre argumente personalizate salary
și message
. Apoi, constructorul Exception
clasei părinte este apelat manual cu self.message
argumentul folosind super()
.
self.salary
Atributul personalizat este definit pentru a fi utilizat ulterior.
Metoda moștenită __str__
a Exception
clasei este apoi utilizată pentru a afișa mesajul corespunzător atunci când SalaryNotInRangeError
este ridicat.
De asemenea, putem personaliza __str__
metoda însăși prin suprascrierea acesteia.
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)
Ieșire
Introduceți suma salariului: 2000 Traceback (ultimul apel ultim): Fișierul "/home/bsoyuj/Desktop/Untitled-1.py", linia 20, în creșterea SalaryNotInRangeError (salariu) __main __. SalaryNotInRangeError: 2000 -> Salariul nu este în ( 5000, 15000)
Pentru a afla mai multe despre cum puteți gestiona excepțiile din Python, accesați Python Exception Handling.