Excepții definite de utilizator în Python cu exemple

Excepții definite de utilizator în Python cu exemple

Excepțiile definite de utilizator sunt create prin definirea unei noi clase de la care moștenește Excepție încorporată în Python clasa sau una dintre subclasele sale. Făcând acest lucru, putem crea mesaje de eroare personalizate și putem gestiona erori specifice într-un mod care are sens pentru aplicația noastră.

Pași pentru a crea și utiliza excepții definite de utilizator

Urmați acești pași pentru a crea și utiliza excepții definite de utilizator în Python:

  • Definiți o nouă clasă de excepție: Creați o nouă clasă care moștenește din Exception sau din oricare dintre subclasele sale.
  • Ridicați excepția: Utilizați instrucțiunea de ridicare pentru a ridica excepția definită de utilizator atunci când apare o anumită condiție.
  • Gestionați excepția: Utilizați blocurile try-except pentru a gestiona excepția definită de utilizator.

Exemplu: În acest exemplu, creăm o excepție personalizată InvalidAgeError pentru a ne asigura că valorile vârstei se încadrează într-un interval valid (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  )   

Ieșire
150 -> Age must be between 0 and 120  

Explicaţie:

  • Clasa InvalidAgeError moștenește de la Exception. Acesta definește o __fierbinte__ metoda de a accepta vârsta și mesajul.
  • Metoda __str__ returnează o reprezentare șir lizibilă a erorii.
  • În set_age() dacă vârsta este în afara intervalului valid (0–120), excepția este ridicată.
  • Blocul try-except prinde excepția și tipărește mesajul de eroare.

Personalizarea claselor de excepție

Când creăm o excepție personalizată, subclasăm clasa de excepție încorporată a lui Python (sau o subclasă precum ValueError TypeError etc.). Apoi putem adăuga propriile noastre metode de atribute sau logica personalizată pentru a face excepția noastră mai informativă.

De asemenea, putem îmbunătăți excepțiile personalizate prin adăugarea de atribute suplimentare sau metode de suprascriere.

Exemplu: Aici îmbunătățim InvalidAgeError adăugând un cod de eroare și personalizând mesajul de eroare.

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  )   

Ieșire
[Error Code 1001] 150 -> Age must be between 0 and 120  

Explicaţie:

  • InvalidAgeError are acum un atribut suplimentar error_code.
  • Metoda __str__ este suprascrisă pentru a afișa atât codul de eroare, cât și vârsta.
  • Când set_age(150) este executat, excepția este ridicată și prinsă în blocul try-except.
  • Mesajul de eroare personalizat este tipărit, făcând eroarea mai descriptivă.

Utilizarea excepțiilor standard ca clasă de bază

Uneori, în loc să moștenim direct de la Exception, putem crea o excepție personalizată prin subclasificarea unei excepții standard, cum ar fi RuntimeError ValueError etc. Acest lucru este util atunci când excepția personalizată ar trebui tratată ca un anumit tip de eroare.

Exemplu: Acest exemplu arată cum să creați o excepție personalizată NetworkError prin moștenirea de la RuntimeError, care este o excepție standard încorporată.

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  )   

Ieșire
('Connection failed')  

Explicaţie:

  • NetworkError moștenește de la RuntimeError, care este un tip de excepție încorporat.
  • Când este ridicat, mesajul este stocat în atributul args ca tuplu.
  • Excepția este capturată și sunt afișate argumentele ei stocate.

Exemplu real: eroare de e-mail nevalidă

Iată un exemplu simplu în care ridicăm o excepție personalizată dacă adresa de e-mail nu este validă:

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  )   

Ieșire
userexample.com -> Invalid email format  

Explicaţie:

  • O nouă clasă de excepție InvalidEmailError este definită pentru a valida adresele de e-mail.
  • Dacă e-mailul dat nu conține „@”, excepția este ridicată.
  • Blocul try-except prinde eroarea și tipărește mesajul formatat.

Când să folosiți excepțiile definite de utilizator?

Excepțiile definite de utilizator ar trebui luate în considerare în următoarele scenarii:

  • Reprezentând erori specifice într-o aplicație (de exemplu, InvalidAgeError DatabaseConnectionError).
  • Furnizarea de mesaje de eroare mai clare și mai descriptive.
  • Gestionarea separată a unui grup de erori asociate folosind except.

Prin utilizarea excepțiilor definite de utilizator, programele devin mai lizibile, mai ușor de întreținut și mai ușor de depanat.

Test sugerat Editați testul 3 întrebări

Ce se întâmplă dacă o excepție definită de utilizator moștenește din RuntimeError în loc de Exception?

  • O

    Nu poate fi prins folosind decât

  • B

    Devine o excepție neverificată

  • C

    Este tratată ca o eroare legată de runtime de către handleri

  • D

    Pierde atributele personalizate

Explicaţie:

Moștenirea de la RuntimeError permite ca aceasta să fie tratată ca o eroare de rulare, precum și ca una personalizată.

De ce este folosit în mod obișnuit super().__init__(self.msg) în clasele de excepții personalizate?

  • O

    Pentru a preveni moștenirea multiplă

  • B

    Pentru a inițializa corect clasa de bază Exception

  • C

    Pentru a depăși urmărirea

  • D

    Pentru a ridica automat excepția

Explicaţie:

Apelarea super() asigură că excepția de bază este inițializată corect cu mesajul.

Ce va fi tipărit dacă o excepție personalizată suprascrie __str__() și este tipărită în interior, cu excepția?

  • O

    Reprezentarea șirului suprascris

  • B

    Adresa de memorie a excepției

  • C

    Doar numele clasei

  • D

    Nimic decât dacă este folosit repr().

Explicaţie:

print(e) apelează __str__() al obiectului excepție.

Excepții definite de utilizator în Python cu exempleTest completat cu succes Scorul dvs.:   2 /3 Precizie:  0% Conectați-vă pentru a vizualiza explicația 1 /3 1 /3 < Previous Următorul >