Lietotāja definēti izņēmumi programmā Python ar piemēriem

Lietotāja definēti izņēmumi programmā Python ar piemēriem

Lietotāja definēti izņēmumi tiek izveidoti, definējot jaunu klasi, kas tiek mantota no Python iebūvētais izņēmums klasei vai kādai no tās apakšklasēm. To darot, mēs varam izveidot pielāgotus kļūdu ziņojumus un apstrādāt konkrētas kļūdas mūsu lietojumprogrammai atbilstošā veidā.

Darbības, lai izveidotu un izmantotu lietotāja definētus izņēmumus

Veiciet šīs darbības, lai programmā Python izveidotu un izmantotu lietotāja definētus izņēmumus:

  • Definējiet jaunu izņēmuma klasi: Izveidojiet jaunu klasi, kas manto no Izņēmuma vai kādas tās apakšklases.
  • Paaugstināt izņēmumu: Izmantojiet pacelšanas priekšrakstu, lai paaugstinātu lietotāja definētu izņēmumu, kad rodas konkrēts nosacījums.
  • Rīkojieties ar izņēmumu: Lai apstrādātu lietotāja definētu izņēmumu, izmantojiet blokus try-except.

Piemērs: Šajā piemērā mēs izveidojam pielāgotu izņēmumu InvalidAgeError, lai nodrošinātu, ka vecuma vērtības ietilpst derīgā diapazonā (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  )   

Izvade
150 -> Age must be between 0 and 120  

Paskaidrojums:

  • Klase InvalidAgeError tiek mantota no izņēmuma. Tas definē an __karsts__ metode, kā pieņemt vecumu un vēstījumu.
  • Metode __str__ atgriež nolasāmu kļūdas virknes attēlojumu.
  • Ja vecums ir ārpus derīgā diapazona (0–120), tiek palielināts izņēmums.
  • Izmēģināšanas bloks uztver izņēmumu un izdrukā kļūdas ziņojumu.

Izņēmuma klašu pielāgošana

Kad mēs izveidojam pielāgotu izņēmumu, mēs apakšklasē Python iebūvēto izņēmuma klasi (vai apakšklasi, piemēram, ValueError TypeError utt.). Pēc tam mēs varam pievienot savas atribūtu metodes vai pielāgotu loģiku, lai mūsu izņēmums būtu informatīvāks.

Mēs varam arī uzlabot pielāgotos izņēmumus, pievienojot papildu atribūtus vai ignorējošās metodes.

Piemērs: Šeit mēs uzlabojam InvalidAgeError, pievienojot kļūdas kodu un pielāgojot kļūdas ziņojumu.

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  )   

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

Paskaidrojums:

  • InvalidAgeError tagad ir papildu atribūts error_code.
  • __str__ metode tiek ignorēta, lai parādītu gan kļūdas kodu, gan vecumu.
  • Kad tiek izpildīts set_age(150), izņēmums tiek palielināts un tiek noķerts try-except blokā.
  • Pielāgotais kļūdas ziņojums tiek izdrukāts, padarot kļūdu aprakstošāku.

Standarta izņēmumu izmantošana kā pamatklase

Dažreiz tā vietā, lai tieši mantotu no izņēmuma, mēs varam izveidot pielāgotu izņēmumu, apakšklasē standarta izņēmumu, piemēram, RuntimeError ValueError utt. Tas ir noderīgi, ja jūsu pielāgotais izņēmums ir jāuzskata par noteikta veida kļūdu.

Piemērs: Šajā piemērā parādīts, kā izveidot pielāgotu izņēmumu NetworkError, mantojot no RuntimeError, kas ir standarta iebūvēts izņēmums.

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  )   

Izvade
('Connection failed')  

Paskaidrojums:

  • NetworkError manto no RuntimeError, kas ir iebūvēts izņēmuma veids.
  • Paceļot ziņojumu, tas tiek saglabāts atribūtā args kā kortežs.
  • Izņēmums tiek uztverts un tiek parādīti tā saglabātie argumenti.

Reāls piemērs: nederīga e-pasta kļūda

Šeit ir vienkāršs piemērs, kurā mēs izvirzām pielāgotu izņēmumu, ja e-pasta adrese nav derīga.

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  )   

Izvade
userexample.com -> Invalid email format  

Paskaidrojums:

  • E-pasta adrešu apstiprināšanai ir definēta jauna izņēmuma klase InvalidEmailError.
  • Ja dotajā e-pastā nav “@”, tiek noteikts izņēmums.
  • Izmēģināšanas bloks uztver kļūdu un izdrukā formatēto ziņojumu.

Kad izmantot lietotāja definētus izņēmumus?

Lietotāja definēti izņēmumi ir jāņem vērā šādos gadījumos:

  • Apzīmē noteiktas kļūdas lietojumprogrammā (piemēram, InvalidAgeError DatabaseConnectionError).
  • Skaidrāku un aprakstošāku kļūdu ziņojumu nodrošināšana.
  • Saistītu kļūdu grupas apstrāde atsevišķi, izmantojot izņemot.

Izmantojot lietotāja definētus izņēmumus, programmas kļūst vieglāk lasāmas, apkopjamas un vieglāk atkļūdojamas.

Ieteiktā viktorīna Rediģēt viktorīnu 3 Jautājumi

Kas notiek, ja lietotāja definēts izņēmums tiek mantots no RuntimeError, nevis izņēmuma?

  • A

    To nevar pieķert, izmantojot, izņemot

  • B

    Tas kļūst par nepārbaudītu izņēmumu

  • C

    Apdarinātāji to uzskata par ar izpildlaiku saistītu kļūdu

  • D

    Tas zaudē pielāgotos atribūtus

Paskaidrojums:

Mantojums no RuntimeError ļauj to apstrādāt kā izpildlaika kļūdu, kā arī kā pielāgotu kļūdu.

Kāpēc pielāgotajās izņēmumu klasēs parasti tiek izmantots super().__init__(self.msg)?

  • A

    Lai novērstu vairākkārtēju mantojumu

  • B

    Lai pareizi inicializētu bāzes Izņēmuma klasi

  • C

    Lai ignorētu izsekošanu

  • D

    Lai automātiski paaugstinātu izņēmumu

Paskaidrojums:

Super() izsaukšana nodrošina, ka bāzes izņēmums tiek pareizi inicializēts ar ziņojumu.

Kas tiks drukāts, ja pielāgotais izņēmums ignorē __str__() un tiek drukāts iekšpusē, izņemot?

  • A

    Ignorētais virknes attēlojums

  • B

    Izņēmuma atmiņas adrese

  • C

    Tikai klases nosaukums

  • D

    Nekas, ja vien netiek izmantots repr().

Paskaidrojums:

print(e) izsauc izņēmuma objekta __str__().

Lietotāja definēti izņēmumi programmā Python ar piemēriemViktorīna ir veiksmīgi pabeigta, jūsu rezultāts:   2 /3 Precizitāte:  0% Piesakieties, lai skatītu skaidrojumu 1 /3 1 /3 < Previous Nākamais >