Korisnički definirane iznimke u Pythonu s primjerima

Korisnički definirane iznimke u Pythonu s primjerima

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.

Python
   class   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:

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

Python
   class   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.

Predloženi kviz Uredi kviz 3 pitanja

Što se događa ako korisnički definirana iznimka naslijedi RuntimeError umjesto Exception?

  • A

    Ne može se uhvatiti korištenjem osim

  • B

    To postaje neprovjerena iznimka

  • C

    Rukovatelji je tretiraju kao pogrešku povezanu s vremenom izvođenja

  • D

    Gubi prilagođene atribute

Obrazloženje:

Nasljeđivanje od RuntimeError omogućuje da se s njom postupa kao s pogreškom vremena izvođenja, kao i kao prilagođenom.

Zašto se super().__init__(self.msg) često koristi u prilagođenim klasama izuzetaka?

  • A

    Kako bi se spriječilo višestruko nasljeđivanje

  • B

    Za pravilno inicijaliziranje osnovne klase Iznimka

  • C

    Za nadjačavanje povratnog praćenja

  • D

    Za automatsko podizanje iznimke

Obrazloženje:

Pozivanje super() osigurava da je osnovni izuzetak ispravno inicijaliziran s porukom.

Što će se ispisati ako prilagođena iznimka nadjača __str__() i ispiše se unutar osim?

  • A

    Nadjačani prikaz niza

  • B

    Memorijska adresa iznimke

  • C

    Samo naziv klase

  • D

    Ništa osim ako se ne koristi repr().

Obrazloženje:

print(e) poziva __str__() objekta iznimke.

Korisnički definirane iznimke u Pythonu s primjerimaKviz uspješno završen Vaš rezultat:   2 /3 Točnost:  0% Prijavite se za pregled objašnjenja 1 /3 1 /3 < Previous Dalje >