Používateľom definované výnimky v Pythone s príkladmi

Používateľom definované výnimky v Pythone s príkladmi

Používateľom definované výnimky sa vytvárajú definovaním novej triedy, ktorá dedí z Vstavaná výnimka Pythonu triedy alebo jednej z jej podtried. Týmto spôsobom môžeme vytvárať vlastné chybové hlásenia a spracovávať špecifické chyby spôsobom, ktorý dáva zmysel našej aplikácii.

Kroky na vytvorenie a používanie výnimiek definovaných používateľom

Pri vytváraní a používaní výnimiek definovaných používateľom v Pythone postupujte podľa týchto krokov:

  • Definujte novú triedu výnimky: Vytvorte novú triedu, ktorá dedí z výnimky alebo ktorejkoľvek z jej podtried.
  • Zvýšte výnimku: Príkaz raise použite na vyvolanie užívateľom definovanej výnimky, keď nastane špecifický stav.
  • Vybaviť výnimku: Na spracovanie používateľom definovanej výnimky použite bloky try-except.

Príklad: V tomto príklade vytvoríme vlastnú výnimku InvalidAgeError, aby sme zabezpečili, že hodnoty veku budú spadať do platného rozsahu (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  )   

Výstup
150 -> Age must be between 0 and 120  

Vysvetlenie:

  • Trieda InvalidAgeError dedí z výnimky. Definuje an __horúce__ spôsob prijatia veku a správy.
  • Metóda __str__ vracia čitateľnú reťazcovú reprezentáciu chyby.
  • Ak je vek v set_age() mimo platného rozsahu (0–120), vyvolá sa výnimka.
  • Blok try-except zachytí výnimku a vytlačí chybové hlásenie.

Prispôsobenie tried výnimiek

Keď vytvoríme vlastnú výnimku, podtriedime vstavanú triedu Exception Pythonu (alebo podtriedu ako ValueError TypeError atď.). Potom môžeme pridať vlastné metódy atribútov alebo vlastnú logiku, aby bola naša výnimka informatívnejšia.

Vlastné výnimky môžeme tiež vylepšiť pridaním ďalších atribútov alebo prepísaných metód.

Príklad: Tu zlepšujeme InvalidAgeError pridaním kódu chyby a prispôsobením chybového hlásenia.

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  )   

Výstup
[Error Code 1001] 150 -> Age must be between 0 and 120  

Vysvetlenie:

  • InvalidAgeError má teraz ďalší atribút error_code.
  • Metóda __str__ je prepísaná, aby sa zobrazil kód chyby aj vek.
  • Keď sa vykoná set_age(150), výnimka sa vyvolá a zachytí v bloku try-except.
  • Vytlačí sa prispôsobené chybové hlásenie, vďaka čomu je chyba popisnejšia.

Používanie štandardných výnimiek ako základnej triedy

Niekedy namiesto priameho dedenia z výnimky môžeme vytvoriť vlastnú výnimku podtriedou štandardnej výnimky, ako je RuntimeError ValueError atď. Toto je užitočné, keď by sa vaša vlastná výnimka mala považovať za špecifický druh chyby.

Príklad: Tento príklad ukazuje, ako vytvoriť vlastnú výnimku NetworkError dedením z RuntimeError, čo je štandardná vstavaná výnimka.

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  )   

Výstup
('Connection failed')  

Vysvetlenie:

  • NetworkError dedí z RuntimeError, čo je vstavaný typ výnimky.
  • Po vyvolaní je správa uložená v atribúte args ako n-tica.
  • Výnimka sa zachytí a zobrazia sa jej uložené argumenty.

Príklad zo skutočného sveta: Chyba neplatného e-mailu

Tu je jednoduchý príklad, kde vyvoláme vlastnú výnimku, ak e-mailová adresa nie je platná:

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  )   

Výstup
userexample.com -> Invalid email format  

Vysvetlenie:

  • Na overenie e-mailových adries je definovaná nová trieda výnimky InvalidEmailError.
  • Ak daný e-mail neobsahuje '@', vyvolá sa výnimka.
  • Blok try-except zachytí chybu a vytlačí naformátovanú správu.

Kedy použiť používateľom definované výnimky?

Používateľom definované výnimky by sa mali zvážiť v nasledujúcich scenároch:

  • Predstavovanie konkrétnych chýb v aplikácii (napr. InvalidAgeError DatabaseConnectionError).
  • Poskytovanie jasnejších a popisnejších chybových hlásení.
  • Samostatné zaobchádzanie so skupinou súvisiacich chýb pomocou okrem.

Použitím užívateľom definovaných výnimiek sa programy stanú čitateľnejšími, udržovateľnými a ľahšie laditeľnými.

Navrhovaný kvíz Upraviť kvíz 3 otázky

Čo sa stane, ak užívateľom definovaná výnimka dedí z RuntimeError namiesto výnimky?

  • A

    Nedá sa chytiť pomocou okrem

  • B

    Stane sa nekontrolovanou výnimkou

  • C

    Obslužné programy to považujú za chybu súvisiacu s runtime

  • D

    Stráca vlastné atribúty

Vysvetlenie:

Dedenie z RuntimeError umožňuje, aby sa s ňou zaobchádzalo ako s chybou runtime, ako aj s vlastnou chybou.

Prečo sa super().__init__(self.msg) bežne používa vo vlastných triedach výnimiek?

  • A

    Aby sa zabránilo viacnásobnému dedeniu

  • B

    Ak chcete správne inicializovať základnú triedu výnimky

  • C

    Na prepísanie spätného sledovania

  • D

    Na automatické zvýšenie výnimky

Vysvetlenie:

Volaním super() sa zabezpečí správna inicializácia základnej výnimky so správou.

Čo sa vytlačí, ak vlastná výnimka prepíše __str__() a vytlačí sa vo vnútri okrem?

  • A

    Prepísaná reťazcová reprezentácia

  • B

    Adresa pamäte výnimky

  • C

    Iba názov triedy

  • D

    Nič, pokiaľ sa nepoužije repr().

Vysvetlenie:

print(e) volá __str__() objektu výnimky.

Používateľom definované výnimky v Pythone s príkladmiKvíz úspešne dokončený Vaše skóre:   2 /3 Presnosť:  0% Prihláste sa na zobrazenie vysvetlenia 1 /3 1 /3 < Previous Ďalej >