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 Exception
klase. 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 CustomError
koja nasljeđuje iz Exception
klase. Ova nova iznimka, kao i ostale iznimke, može se pokrenuti korištenjem raise
izjave 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.py
ili 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 ( ValueTooSmallError
i 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 Exception
klase da prihvati vlastite prilagođene argumente salary
i message
. Zatim se konstruktor roditeljske Exception
klase poziva ručno s self.message
argumentom using super()
.
Prilagođeni self.salary
atribut definiran je za upotrebu kasnije.
Naslijeđena __str__
metoda Exception
klase tada se koristi za prikaz odgovarajuće poruke kada SalaryNotInRangeError
se 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.