Kako definirati prilagođene iznimke u Pythonu? (S primjerima)

U ovom vodiču naučit ćete kako pomoću primjera definirati prilagođene iznimke ovisno o vašim zahtjevima.

Python ima brojne ugrađene iznimke koje prisiljavaju vaš program na pogrešku kada nešto u programu pođe po zlu.

Međutim, ponekad ćete možda trebati stvoriti vlastite prilagođene iznimke koje služe vašoj svrsi.

Stvaranje prilagođenih iznimaka

U Pythonu korisnici mogu definirati prilagođene iznimke stvaranjem nove klase. Ova klasa iznimke mora se izvesti, bilo izravno ili neizravno, iz ugrađene Exceptionklase. Većina ugrađenih iznimaka također je izvedena iz ove klase.

 >>> 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

Ovdje smo stvorili korisnički definiranu iznimku koja se naziva CustomErrorkoja nasljeđuje iz Exceptionklase. Ova nova iznimka, kao i ostale iznimke, može se pokrenuti korištenjem raiseizjave s neobaveznom porukom o pogrešci.

Kada razvijamo veliki program Python, dobra je praksa smjestiti sve korisnički definirane iznimke koje naš program pokreće u zasebnu datoteku. Mnogi standardni moduli to rade. Svoje iznimke definiraju odvojeno kao exceptions.pyili errors.py(općenito, ali ne uvijek).

Korisnički definirana klasa iznimke može implementirati sve što normalna klasa može učiniti, ali mi je obično činimo jednostavnom i sažetom. Većina implementacija deklarira prilagođenu osnovnu klasu i izvodi druge klase iznimki iz ove osnovne klase. Ovaj je koncept jasniji u sljedećem primjeru.

Primjer: Korisnički definirana iznimka u Pythonu

U ovom ćemo primjeru ilustrirati kako se korisnički definirane iznimke mogu koristiti u programu za podizanje i hvatanje pogrešaka.

Ovaj će program tražiti od korisnika da unese broj sve dok pravilno ne pogodi pohranjeni broj. Da bi im pomogao shvatiti, daje se naputak je li njihova pretpostavka veća ili manja od pohranjenog broja.

 # 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.")

Evo primjera izvođenja ovog programa.

Unesite broj: 12 Ova je vrijednost prevelika, pokušajte ponovno! Unesite broj: 0 Ova je vrijednost premala, pokušajte ponovno! Unesite broj: 8 Ova je vrijednost premala, pokušajte ponovno! Unesite broj: 10 Čestitamo! Dobro ste pogodili.

Definirali smo osnovnu klasu tzv Error.

Druge dvije iznimke ( ValueTooSmallErrori ValueTooLargeError) koje je zapravo pokrenuo naš program izvedene su iz ove klase. Ovo je standardni način definiranja iznimki koje definiraju korisnici u programiranju na Pythonu, ali niste ograničeni samo na taj način.

Prilagođavanje klasa izuzetaka

Ovu klasu možemo dalje prilagoditi tako da prihvaća druge argumente prema našim potrebama.

Da biste naučili o prilagođavanju klasa Exception, morate imati osnovno znanje o objektno orijentiranom programiranju.

Posjetite Python objektno orijentirano programiranje da biste započeli učenje o objektno orijentiranom programiranju u Pythonu.

Pogledajmo jedan primjer:

 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)

Izlaz

 Unesite iznos plaće: 2000 Traceback (najnoviji zadnji poziv): Datoteka "", redak 17, u povećanju SalaryNotInRangeError (plaća) __main __. SalaryNotInRangeError: Plaća nije u rasponu (5000, 15000)

Ovdje smo nadjačali konstruktor Exceptionklase da prihvati vlastite prilagođene argumente salaryi message. Zatim se konstruktor roditeljske Exceptionklase poziva ručno s self.messageargumentom using super().

Prilagođeni self.salaryatribut definiran je za upotrebu kasnije.

Naslijeđena __str__metoda Exceptionklase tada se koristi za prikaz odgovarajuće poruke kada SalaryNotInRangeErrorse podigne.

Također možemo prilagoditi samu __str__metodu nadjačavanjem.

 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)

Izlaz

 Unesite iznos plaće: 2000 Traceback (najnoviji zadnji poziv): Datoteka "/home/bsoyuj/Desktop/Untitled-1.py", redak 20, u povišici SalaryNotInRangeError (plaća) __main __. SalaryNotInRangeError: 2000 -> Plaća nije u ( 5000, 15000) raspon

Da biste saznali više o tome kako se možete nositi s iznimkama u Pythonu, posjetite Python Exception Handling.

Zanimljivi članci...