Käyttäjän määrittämät poikkeukset Pythonissa esimerkein

Käyttäjän määrittämät poikkeukset Pythonissa esimerkein

Käyttäjän määrittämät poikkeukset luodaan määrittämällä uusi luokka, joka perii Pythonin sisäänrakennettu poikkeus luokka tai jokin sen alaluokista. Näin voimme luoda mukautettuja virheilmoituksia ja käsitellä tiettyjä virheitä sovelluksemme kannalta järkevällä tavalla.

Vaiheet käyttäjän määrittämien poikkeuksien luomiseen ja käyttämiseen

Noudata näitä ohjeita luodaksesi ja käyttääksesi käyttäjän määrittämiä poikkeuksia Pythonissa:

  • Määritä uusi poikkeusluokka: Luo uusi luokka, joka perii Exceptionista tai mistä tahansa sen alaluokista.
  • Nosta poikkeus: Käytä raise-käskyä nostaaksesi käyttäjän määrittämää poikkeusta tietyn ehdon esiintyessä.
  • Käsittele poikkeus: Käytä try-except-lohkoja käsitelläksesi käyttäjän määrittämää poikkeusta.

Esimerkki: Tässä esimerkissä luomme mukautetun poikkeuksen InvalidAgeError varmistaaksemme, että ikäarvot ovat kelvollisen alueen (0–120) sisällä.

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  )   

Lähtö
150 -> Age must be between 0 and 120  

Selitys:

  • InvalidAgeError-luokka perii Poikkeuksen. Se määrittelee an __kuuma__ tapa hyväksyä ikä ja viesti.
  • Metodi __str__ palauttaa virheen luettavan merkkijonoesityksen.
  • Kohdassa set_age(), jos ikä on kelvollisen alueen (0–120) ulkopuolella, poikkeus korotetaan.
  • Try-except-lohko havaitsee poikkeuksen ja tulostaa virheilmoituksen.

Poikkeusluokkien mukauttaminen

Kun luomme mukautetun poikkeuksen, alaluokittelemme Pythonin sisäänrakennetun Exception-luokan (tai alaluokan, kuten ValueError TypeError jne.). Voimme sitten lisätä omia attribuuttimenetelmiämme tai mukautettua logiikkaa tehdäksemme poikkeuksestamme informatiivisemman.

Voimme myös parantaa mukautettuja poikkeuksia lisäämällä ylimääräisiä määritteitä tai ohittavia menetelmiä.

Esimerkki: Tässä parannamme InvalidAgeErroria lisäämällä virhekoodin ja mukauttamalla virheviestiä.

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  )   

Lähtö
[Error Code 1001] 150 -> Age must be between 0 and 120  

Selitys:

  • InvalidAgeError sisältää nyt lisäattribuutin error_code.
  • __str__-menetelmä ohitetaan näyttämään sekä virhekoodi että ikä.
  • Kun set_age(150) suoritetaan, poikkeus nostetaan ja kiinnitetään try-except-lohkoon.
  • Mukautettu virheilmoitus tulostetaan, mikä tekee virheestä kuvaavamman.

Vakiopoikkeusten käyttäminen perusluokkana

Joskus sen sijaan, että periisimme suoraan poikkeuksesta, voimme luoda mukautetun poikkeuksen alaluokittamalla vakiopoikkeuksen, kuten RuntimeError ValueError jne. Tämä on hyödyllistä, kun mukautettua poikkeusta pitäisi käsitellä tietynlaisena virheenä.

Esimerkki: Tämä esimerkki näyttää, kuinka luodaan mukautettu NetworkError-poikkeus perimällä RuntimeError, joka on tavallinen sisäänrakennettu poikkeus.

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  )   

Lähtö
('Connection failed')  

Selitys:

  • NetworkError perii RuntimeErrorin, joka on sisäänrakennettu poikkeustyyppi.
  • Kun viesti nostetaan ylös, se tallennetaan args-attribuutissa monikkona.
  • Poikkeus kiinnitetään ja sen tallennetut argumentit näytetään.

Tosimaailman esimerkki: Virheellinen sähköposti

Tässä on yksinkertainen esimerkki, jossa nostamme mukautetun poikkeuksen, jos sähköpostiosoite ei ole kelvollinen:

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  )   

Lähtö
userexample.com -> Invalid email format  

Selitys:

  • Uusi poikkeusluokka InvalidEmailError on määritetty vahvistamaan sähköpostiosoitteet.
  • Jos annettu sähköposti ei sisällä @-merkkiä, poikkeus tehdään.
  • Yritä paitsi -lohko havaitsee virheen ja tulostaa muotoillun viestin.

Milloin käyttää käyttäjän määrittämiä poikkeuksia?

Käyttäjän määrittämiä poikkeuksia tulee harkita seuraavissa skenaarioissa:

  • Ilmoittaa tiettyjä virheitä sovelluksessa (esim. InvalidAgeError DatabaseConnectionError).
  • Selkeämpiä ja kuvaavampia virheilmoituksia.
  • Asiaan liittyvien virheiden ryhmän käsittely erikseen käyttämällä paitsi.

Käyttämällä käyttäjän määrittämiä poikkeuksia ohjelmista tulee helpommin luettavia, ylläpidettäviä ja helpompia korjata.

Suositeltu tietokilpailu Muokkaa tietokilpailua 3 kysymystä

Mitä tapahtuu, jos käyttäjän määrittämä poikkeus perii RuntimeErrorin poikkeuksen sijaan?

  • A

    Sitä ei saa kiinni käyttämällä paitsi

  • B

    Siitä tulee tarkistamaton poikkeus

  • C

    Käsittelijät pitävät sitä ajonaikaisena virheenä

  • D

    Se menettää mukautetut attribuutit

Selitys:

RuntimeErrorista periminen mahdollistaa sen käsittelyn ajonaikaisena virheenä sekä mukautettuna virheenä.

Miksi super().__init__(self.msg) käytetään yleisesti mukautetuissa poikkeusluokissa?

  • A

    Moniperinnön estämiseksi

  • B

    Peruspoikkeusluokan alustaminen oikein

  • C

    Ohita jäljitys

  • D

    Poikkeuksen automaattinen korottaminen

Selitys:

Super():n kutsuminen varmistaa, että peruspoikkeus alustetaan oikein viestin kanssa.

Mitä tulostetaan, jos mukautettu poikkeus ohittaa __str__() ja tulostetaan paitsi?

  • A

    Ohitettu merkkijonoesitys

  • B

    Poikkeuksen muistiosoite

  • C

    Vain luokan nimi

  • D

    Ei mitään, ellei repr():tä käytetä

Selitys:

print(e) kutsuu poikkeusobjektin __str__().

Käyttäjän määrittämät poikkeukset Pythonissa esimerkeinTietokilpailu suoritettu onnistuneesti pisteesi:   2 /3 Tarkkuus:  0 % Kirjaudu sisään nähdäksesi selityksen 1 /3 1 /3 < Previous Seuraava >