Cum se definesc excepții personalizate în Python? (Cu exemple)

Î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 Exceptionclasa î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ă CustomErrorcare moștenește de la Exceptionclasă. Această nouă excepție, ca și alte excepții, poate fi ridicată folosind raiseinstrucț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.pysau 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 Exceptionclasei pentru a accepta propriile noastre argumente personalizate salaryși message. Apoi, constructorul Exceptionclasei părinte este apelat manual cu self.messageargumentul folosind super().

self.salaryAtributul personalizat este definit pentru a fi utilizat ulterior.

Metoda moștenită __str__a Exceptionclasei este apoi utilizată pentru a afișa mesajul corespunzător atunci când SalaryNotInRangeErroreste 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.

Articole interesante...