Uporabniško določene izjeme v Pythonu s primeri

Uporabniško določene izjeme v Pythonu s primeri

Uporabniško določene izjeme se ustvarijo z definiranjem novega razreda, ki deduje Pythonova vgrajena izjema razreda ali enega od njegovih podrazredov. S tem lahko ustvarimo sporočila o napakah po meri in določene napake obravnavamo na način, ki je smiseln za našo aplikacijo.

Koraki za ustvarjanje in uporabo uporabniško določenih izjem

Za ustvarjanje in uporabo uporabniško določenih izjem v Pythonu sledite tem korakom:

  • Določite nov razred izjem: Ustvarite nov razred, ki deduje Exception ali katerega koli od njegovih podrazredov.
  • Dvignite izjemo: Uporabite stavek dviga, da dvignete uporabniško definirano izjemo, ko nastopi določen pogoj.
  • Obravnava izjeme: Za obravnavo uporabniško določene izjeme uporabite bloke poskusi razen.

primer:

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  )   

Izhod
150 -> Age must be between 0 and 120  

Pojasnilo:

  • Razred InvalidAgeError podeduje razred Exception. Določa an __vroče__ način sprejemanja starosti in sporočila.
  • Metoda __str__ vrne berljivo predstavitev niza napake.
  • V set_age(), če je starost zunaj veljavnega obsega (0–120), se sproži izjema.
  • Blok poskusi razen ujame izjemo in natisne sporočilo o napaki.

Prilagajanje izjemnih razredov

Ko ustvarimo izjemo po meri, Pythonov vgrajeni razred Exception uvrstimo v podrazred (ali podrazred, kot je ValueError TypeError itd.). Nato lahko dodamo lastne metode atributov ali logiko po meri, da bo naša izjema bolj informativna.

Izjeme po meri lahko izboljšamo tudi z dodajanjem dodatnih atributov ali preglasitvenih metod.

primer: Tukaj izboljšamo InvalidAgeError tako, da dodamo kodo napake in prilagodimo sporočilo o napaki.

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  )   

Izhod
[Error Code 1001] 150 -> Age must be between 0 and 120  

Pojasnilo:

  • InvalidAgeError ima zdaj dodaten atribut error_code.
  • Metoda __str__ je preglasena za prikaz kode napake in starosti.
  • Ko se izvede set_age(150), se izjema sproži in ujame v bloku poskusi razen.
  • Prilagojeno sporočilo o napaki se natisne, tako da je napaka bolj opisna.

Uporaba standardnih izjem kot osnovnega razreda

Včasih lahko namesto neposrednega dedovanja iz Izjeme ustvarimo izjemo po meri tako, da podrazredimo standardno izjemo, kot je RuntimeError ValueError itd. To je uporabno, ko je treba vašo izjemo po meri obravnavati kot posebno vrsto napake.

primer: Ta primer prikazuje, kako ustvariti izjemo po meri NetworkError z dedovanjem od RuntimeError, ki je standardna vgrajena izjema.

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  )   

Izhod
('Connection failed')  

Pojasnilo:

  • NetworkError podeduje RuntimeError, ki je vgrajena vrsta izjeme.
  • Ko je sporočilo dvignjeno, je shranjeno v atributu args kot torka.
  • Izjema je ujeta in njeni shranjeni argumenti so prikazani.

Primer iz resničnega sveta: napaka neveljavne e-pošte

Tukaj je preprost primer, kjer sprožimo izjemo po meri, če e-poštni naslov ni veljaven:

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  )   

Izhod
userexample.com -> Invalid email format  

Pojasnilo:

  • Za preverjanje e-poštnih naslovov je definiran nov razred izjeme InvalidEmailError.
  • Če dani e-poštni naslov ne vsebuje znaka "@", se sproži izjema.
  • Blok poskusi razen zazna napako in natisne oblikovano sporočilo.

Kdaj uporabiti uporabniško določene izjeme?

Uporabniško določene izjeme je treba upoštevati v naslednjih scenarijih:

  • Predstavljanje določenih napak v aplikaciji (npr. InvalidAgeError DatabaseConnectionError).
  • Zagotavljanje jasnejših in bolj opisnih sporočil o napakah.
  • Ločeno obravnavanje skupine povezanih napak z uporabo razen.

Z uporabo uporabniško določenih izjem postanejo programi bolj berljivi, vzdržljivi in ​​lažji za odpravljanje napak.

Predlagani kviz Uredi kviz 3 vprašanja

Kaj se zgodi, če uporabniško določena izjema podeduje RuntimeError namesto Exception?

  • A

    Ni ga mogoče ujeti z uporabo razen

  • B

    Postane nepreverjena izjema

  • C

    Obdelovalci jo obravnavajo kot napako, povezano z izvajanjem

  • D

    Izgubi atribute po meri

Pojasnilo:

Dedovanje iz RuntimeError omogoča, da se obravnava kot napaka med izvajanjem in tudi kot napaka po meri.

Zakaj se super().__init__(self.msg) pogosto uporablja v razredih izjem po meri?

  • A

    Za preprečevanje večkratnega dedovanja

  • B

    Za pravilno inicializacijo osnovnega razreda izjeme

  • C

    Za preglasitev povratnega sledenja

  • D

    Za samodejno sprožitev izjeme

Pojasnilo:

Klic super() zagotavlja, da je osnovna izjema pravilno inicializirana s sporočilom.

Kaj bo natisnjeno, če izjema po meri preglasi __str__() in je natisnjena znotraj razen?

  • A

    Preglasena predstavitev niza

  • B

    Pomnilniški naslov izjeme

  • C

    Samo ime razreda

  • D

    Nič, razen če je uporabljen repr().

Pojasnilo:

print(e) pokliče __str__() objekta izjeme.

Uporabniško določene izjeme v Pythonu s primeriKviz uspešno zaključen Vaš rezultat:   2 /3 Natančnost:  0 % Prijavite se za ogled razlage 1 /3 1 /3 < Previous Naprej >