Vartotojo nustatytos išimtys Python su pavyzdžiais

Vartotojo nustatytos išimtys Python su pavyzdžiais

Vartotojo nustatytos išimtys sukuriamos apibrėžiant naują klasę, kuri paveldima iš Python integruota išimtis klasė arba vienas iš jos poklasių. Tai darydami galime sukurti pasirinktinius klaidų pranešimus ir tvarkyti konkrečias klaidas taip, kad tai būtų naudinga mūsų programai.

Vartotojo nustatytų išimčių kūrimo ir naudojimo veiksmai

Norėdami sukurti ir naudoti vartotojo nustatytas išimtis programoje Python, atlikite šiuos veiksmus:

  • Apibrėžkite naują išimties klasę: Sukurkite naują klasę, kuri paveldės iš Exception arba bet kurio jos poklasio.
  • Padidinkite išimtį: Naudokite kėlimo teiginį, kad padidintumėte vartotojo nustatytą išimtį, kai įvyksta konkreti sąlyga.
  • Tvarkykite išimtį: Naudokite try-except blokus, kad galėtumėte apdoroti vartotojo apibrėžtą išimtį.

Pavyzdys: Šiame pavyzdyje sukuriame tinkintą išimtį InvalidAgeError, kad užtikrintume, jog amžiaus reikšmės patenka į tinkamą 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  )   

Išvestis
150 -> Age must be between 0 and 120  

Paaiškinimas:

  • InvalidAgeError klasė paveldima iš išimties. Jis apibrėžia an __karšta__ būdas priimti amžių ir žinią.
  • Metodas __str__ grąžina skaitomą klaidos eilutės vaizdą.
  • Jei amžius nepatenka į galiojantį diapazoną (0–120), set_age() išimtis padidinama.
  • „Try-except“ blokas užfiksuoja išimtį ir išspausdina klaidos pranešimą.

Išimčių klasių pritaikymas

Kai sukuriame pasirinktinę išimtį, poklasiuojame „Python“ integruotą išimties klasę (arba poklasį, pvz., „ValueError TypeError“ ir kt.). Tada galime pridėti savo atributų metodus arba pasirinktinę logiką, kad mūsų išimtis būtų informatyvesnė.

Taip pat galime patobulinti pasirinktines išimtis pridėdami papildomų atributų arba nepaisydami metodų.

Pavyzdys: Čia mes patobuliname InvalidAgeError pridėdami klaidos kodą ir tinkindami klaidos pranešimą.

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  )   

Išvestis
[Error Code 1001] 150 -> Age must be between 0 and 120  

Paaiškinimas:

  • InvalidAgeError dabar turi papildomą atributą error_code.
  • __str__ metodas nepaisomas, kad būtų rodomas ir klaidos kodas, ir amžius.
  • Kai vykdomas set_age(150), išimtis padidinama ir užfiksuojama try-except bloke.
  • Pritaikytas klaidos pranešimas išspausdinamas, todėl klaidą apibūdina labiau.

Standartinių išimčių naudojimas kaip bazinė klasė

Kartais užuot paveldėję tiesiogiai iš išimties, galime sukurti pasirinktinę išimtį, suskirstydami standartinę išimtį, pvz., RuntimeError ValueError ir tt Tai naudinga, kai jūsų pasirinkta išimtis turėtų būti traktuojama kaip konkreti klaida.

Pavyzdys: Šiame pavyzdyje parodyta, kaip sukurti tinkintą išimtį NetworkError, paveldint iš RuntimeError, kuri yra standartinė integruota išimtis.

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  )   

Išvestis
('Connection failed')  

Paaiškinimas:

  • NetworkError paveldi iš RuntimeError, kuris yra įtaisytasis išimties tipas.
  • Pakėlus pranešimas išsaugomas atribute args kaip eilutė.
  • Išimtis užfiksuojama ir rodomi jos išsaugoti argumentai.

Realus pavyzdys: netinkamo el. pašto klaida

Štai paprastas pavyzdys, kai pateikiame tinkintą išimtį, jei el. pašto adresas negalioja:

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  )   

Išvestis
userexample.com -> Invalid email format  

Paaiškinimas:

  • El. pašto adresams patvirtinti nustatyta nauja išimties klasė InvalidEmailError.
  • Jei nurodytame el. laiške nėra „@“, taikoma išimtis.
  • „Try-except“ blokas užfiksuoja klaidą ir išspausdina suformatuotą pranešimą.

Kada naudoti vartotojo nustatytas išimtis?

Naudotojo apibrėžtos išimtys turėtų būti svarstomos šiais atvejais:

  • Nurodomos konkrečios programos klaidos (pvz., InvalidAgeError DatabaseConnectionError).
  • Teikti aiškesnius ir labiau aprašomus klaidų pranešimus.
  • Susijusių klaidų grupės tvarkymas atskirai naudojant išskyrus.

Naudojant vartotojo nustatytas išimtis, programos tampa lengviau skaitomos, prižiūrimos ir lengviau derinamos.

Siūloma viktorina Redaguoti viktoriną 3 klausimai

Kas atsitiks, jei vartotojo nustatyta išimtis paveldės iš RuntimeError, o ne iš Exception?

  • A

    Jo negalima sugauti naudojant, išskyrus

  • B

    Tai tampa nekontroliuojama išimtimi

  • C

    Tai tvarkytojai traktuoja kaip su vykdymo laiku susijusią klaidą

  • D

    Jis praranda pasirinktinius atributus

Paaiškinimas:

Paveldėjimas iš RuntimeError leidžia ją tvarkyti kaip vykdymo laiko klaidą ir kaip pasirinktinę.

Kodėl „super().__init__(self.msg)“ dažniausiai naudojamas tinkintose išimčių klasėse?

  • A

    Kad būtų išvengta daugybinio paveldėjimo

  • B

    Norėdami tinkamai inicijuoti bazinę Išimčių klasę

  • C

    Norėdami nepaisyti sekimo

  • D

    Norėdami automatiškai padidinti išimtį

Paaiškinimas:

Iškvietus super() užtikrinama, kad pagrindinė išimtis būtų tinkamai inicijuota su pranešimu.

Kas bus išspausdinta, jei tinkinta išimtis nepaisys __str__() ir bus išspausdinta viduje išskyrus?

  • A

    Nepaisoma eilutės atvaizdavimas

  • B

    Išimties atminties adresas

  • C

    Tik klasės pavadinimas

  • D

    Nieko, nebent naudojamas repr().

Paaiškinimas:

print(e) iškviečia išimties objekto __str__().

Vartotojo nustatytos išimtys Python su pavyzdžiaisViktorina sėkmingai atlikta jūsų balas:   2 /3 Tikslumas:  0 % Prisijunkite, kad pamatytumėte paaiškinimą 1 /3 1 /3 < Previous Kitas >