Korisnički definirane iznimke stvaraju se definiranjem nove klase koja nasljeđuje Iznimka ugrađena u Python klasa ili jedna od njenih podklasa. Na taj način možemo stvoriti prilagođene poruke o pogrešci i obrađivati određene pogreške na način koji ima smisla za našu aplikaciju.
Koraci za stvaranje i korištenje korisnički definiranih iznimaka
Slijedite ove korake za stvaranje i korištenje korisnički definiranih iznimaka u Pythonu:
- Definirajte novu klasu iznimke: Stvorite novu klasu koja nasljeđuje Exception ili bilo koju njegovu podklasu.
- Podignite iznimku: Koristite naredbu raise za podizanje korisnički definirane iznimke kada se dogodi određeni uvjet.
- Rješavanje iznimke: Upotrijebite blokove try-except za obradu korisnički definirane iznimke.
Primjer: U ovom primjeru stvaramo prilagođenu iznimku InvalidAgeError kako bismo osigurali da vrijednosti dobi budu unutar važećeg raspona (0–120).
Python# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Izlaz
150 -> Age must be between 0 and 120
Obrazloženje:
- Klasa InvalidAgeError nasljeđuje od Exception. Definira an __vruće__ način prihvaćanja dobi i poruke.
- Metoda __str__ vraća čitljiv prikaz niza pogreške.
- U set_age() ako je dob izvan važećeg raspona (0–120), pokreće se iznimka.
- Blok try-except hvata iznimku i ispisuje poruku o pogrešci.
Prilagodba klasa izuzetaka
Kada stvorimo prilagođenu iznimku, Pythonov ugrađeni Exception razred činimo potklasom (ili potklasom kao što je ValueError TypeError itd.). Zatim možemo dodati vlastite metode atributa ili prilagođenu logiku kako bismo našu iznimku učinili informativnijom.
Također možemo poboljšati prilagođene iznimke dodavanjem dodatnih atributa ili metoda nadjačavanja.
Primjer: Ovdje poboljšavamo InvalidAgeError dodavanjem koda pogreške i prilagođavanjem poruke pogreške.
Pythonclass InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Izlaz
[Error Code 1001] 150 -> Age must be between 0 and 120
Obrazloženje:
- InvalidAgeError sada ima dodatni atribut error_code.
- Metoda __str__ nadjačana je kako bi se prikazao i kôd pogreške i dob.
- Kada se set_age(150) izvrši, iznimka se pokreće i hvata u bloku try-except.
- Ispisuje se prilagođena poruka o pogrešci što pogrešku bolje opisuje.
Korištenje standardnih iznimaka kao osnovne klase
Ponekad umjesto izravnog nasljeđivanja od Exceptiona možemo stvoriti prilagođenu iznimku potklasiranjem standardne iznimke kao što je RuntimeError ValueError itd. Ovo je korisno kada se vaša prilagođena iznimka treba tretirati kao posebna vrsta pogreške.
Primjer: Ovaj primjer pokazuje kako stvoriti prilagođenu iznimku NetworkError nasljeđivanjem od RuntimeError koja je standardna ugrađena iznimka.
Python# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args)
Izlaz
('Connection failed') Obrazloženje:
sql vrste podataka
- NetworkError nasljeđuje RuntimeError koji je ugrađena vrsta iznimke.
- Kada se podigne, poruka se pohranjuje u atribut args kao tuple.
- Iznimka je uhvaćena i prikazani su njeni pohranjeni argumenti.
Primjer iz stvarnog svijeta: pogreška nevažeće e-pošte
Evo jednostavnog primjera u kojem pokrećemo prilagođenu iznimku ako adresa e-pošte nije važeća:
Pythonclass InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e)
Izlaz
userexample.com -> Invalid email format
Obrazloženje:
- Nova klasa iznimke InvalidEmailError definirana je za provjeru valjanosti adresa e-pošte.
- Ako navedena e-pošta ne sadrži '@', pokreće se iznimka.
- Blok try-except hvata pogrešku i ispisuje formatiranu poruku.
Kada koristiti korisnički definirane iznimke?
Korisnički definirane iznimke treba uzeti u obzir u sljedećim scenarijima:
- Predstavljanje specifičnih pogrešaka u aplikaciji (npr. InvalidAgeError DatabaseConnectionError).
- Pružanje jasnijih i opisnijih poruka o pogreškama.
- Odvojeno rukovanje grupom povezanih pogrešaka pomoću osim.
Korištenjem korisnički definiranih iznimaka programi postaju čitljiviji, lakši za održavanje i otklanjanje pogrešaka.