Uživatelsky definované výjimky v Pythonu s příklady

Uživatelsky definované výjimky v Pythonu s příklady

Uživatelem definované výjimky se vytvářejí definováním nové třídy, která dědí z Vestavěná výjimka v Pythonu třídy nebo jedné z jejích podtříd. Tímto způsobem můžeme vytvářet vlastní chybové zprávy a zpracovávat konkrétní chyby způsobem, který dává smysl naší aplikaci.

Kroky k vytvoření a použití uživatelem definovaných výjimek

Chcete-li vytvořit a používat uživatelem definované výjimky v Pythonu, postupujte takto:

  • Definujte novou třídu výjimky: Vytvořte novou třídu, která dědí z Exception nebo kterékoli z jejích podtříd.
  • Zvýšit výjimku: Použijte příkaz raise k vyvolání uživatelem definované výjimky, když nastane určitá podmínka.
  • Zpracovat výjimku: Ke zpracování uživatelem definované výjimky použijte bloky try-except.

Příklad: V tomto příkladu vytvoříme vlastní výjimku InvalidAgeError, abychom zajistili, že hodnoty věku spadají 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  

Vysvětlení:

  • Třída InvalidAgeError dědí z výjimky. Definuje an __horký__ způsob, jak přijmout věk a zprávu.
  • Metoda __str__ vrací čitelnou řetězcovou reprezentaci chyby.
  • Pokud je v set_age() věk mimo platný rozsah (0–120), vyvolá se výjimka.
  • Blok try-except zachytí výjimku a vytiskne chybovou zprávu.

Přizpůsobení tříd výjimek

Když vytvoříme vlastní výjimku, podtřídíme třídu Exception vestavěnou v Pythonu (nebo podtřídu jako ValueError TypeError atd.). Poté můžeme přidat vlastní metody atributů nebo vlastní logiku, aby byla naše výjimka informativnější.

Můžeme také vylepšit vlastní výjimky přidáním dalších atributů nebo přepisovacích metod.

Příklad: Zde vylepšujeme InvalidAgeError přidáním kódu chyby a přizpůsobením chybové zprávy.

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  

Vysvětlení:

  • InvalidAgeError má nyní další atribut error_code.
  • Metoda __str__ je přepsána, aby se zobrazil kód chyby i věk.
  • Po provedení set_age(150) je vyvolána výjimka a zachycena v bloku try-except.
  • Přizpůsobená chybová zpráva se vytiskne, takže chyba bude popisnější.

Použití standardních výjimek jako základní třídy

Někdy místo přímého dědění z výjimky můžeme vytvořit vlastní výjimku podtřídou standardní výjimky, jako je RuntimeError ValueError atd. To je užitečné, když by se s vaší vlastní výjimkou mělo zacházet jako se specifickým druhem chyby.

Příklad: Tento příklad ukazuje, jak vytvořit vlastní výjimku NetworkError zděděním z RuntimeError, což je standardní vestavěná výjimka.

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')  

Vysvětlení:

  • NetworkError dědí z RuntimeError, což je vestavěný typ výjimky.
  • Po vyvolání je zpráva uložena v atributu args jako n-tice.
  • Výjimka je zachycena a jsou zobrazeny její uložené argumenty.

Příklad ze skutečného světa: Chyba neplatného e-mailu

Zde je jednoduchý příklad, kdy vyvoláme vlastní výjimku, pokud e-mailová adresa není 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  

Vysvětlení:

  • Pro ověření e-mailových adres je definována nová třída výjimky InvalidEmailError.
  • Pokud daný e-mail neobsahuje '@', je vyvolána výjimka.
  • Blok try-except zachytí chybu a vytiskne naformátovanou zprávu.

Kdy použít uživatelem definované výjimky?

Uživatelsky definované výjimky by měly být zváženy v následujících scénářích:

  • Reprezentující konkrétní chyby v aplikaci (např. InvalidAgeError DatabaseConnectionError).
  • Poskytování jasnějších a popisnějších chybových zpráv.
  • Samostatné zpracování skupiny souvisejících chyb pomocí kromě.

Použitím uživatelsky definovaných výjimek se programy stávají čitelnějšími, udržovatelné a snadněji laditelné.

Doporučený kvíz Upravit kvíz 3 Otázky

Co se stane, když uživatelsky definovaná výjimka zdědí z RuntimeError namísto výjimky?

  • A

    Nelze jej chytit pomocí kromě

  • B

    Stane se nekontrolovanou výjimkou

  • C

    Obslužné rutiny to považují za chybu související s runtime

  • D

    Ztrácí vlastní atributy

Vysvětlení:

Dědění z RuntimeError umožňuje, aby byla zpracována jako chyba runtime i jako vlastní.

Proč se super().__init__(self.msg) běžně používá ve vlastních třídách výjimek?

  • A

    Aby se zabránilo vícenásobnému dědictví

  • B

    Chcete-li správně inicializovat základní třídu Exception

  • C

    Chcete-li přepsat traceback

  • D

    Pro automatické vyvolání výjimky

Vysvětlení:

Volání super() zajistí správnou inicializaci základní výjimky se zprávou.

Co se vytiskne, pokud vlastní výjimka přepíše __str__() a bude vytištěna uvnitř kromě?

  • A

    Přepsaná řetězcová reprezentace

  • B

    Adresa paměti výjimky

  • C

    Pouze název třídy

  • D

    Nic, pokud není použito repr().

Vysvětlení:

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

Uživatelsky definované výjimky v Pythonu s příkladyKvíz úspěšně dokončen Vaše skóre:   2 /3 Přesnost:  0 % Pro zobrazení vysvětlení se přihlaste 1 /3 1 /3 < Previous Další >