Brukerdefinerte unntak i Python med eksempler

Brukerdefinerte unntak i Python med eksempler

Brukerdefinerte unntak opprettes ved å definere en ny klasse som arver fra Pythons innebygde unntak klasse eller en av dens underklasser. Ved å gjøre dette kan vi lage tilpassede feilmeldinger og håndtere spesifikke feil på en måte som gir mening for applikasjonen vår.

Trinn for å opprette og bruke brukerdefinerte unntak

Følg disse trinnene for å opprette og bruke brukerdefinerte unntak i Python:

  • Definer en ny unntaksklasse: Opprett en ny klasse som arver fra Exception eller noen av dens underklasser.
  • Hev unntaket: Bruk raise-setningen til å øke det brukerdefinerte unntaket når en bestemt tilstand oppstår.
  • Håndter unntaket: Bruk try-except-blokker for å håndtere det brukerdefinerte unntaket.

Eksempel: I dette eksemplet oppretter vi et tilpasset unntak InvalidAgeError for å sikre at aldersverdier faller innenfor et gyldig område (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  )   

Produksjon
150 -> Age must be between 0 and 120  

Forklaring:

  • InvalidAgeError-klassen arver fra Exception. Den definerer en __varm__ metode for å akseptere alder og budskap.
  • __str__-metoden returnerer en lesbar strengrepresentasjon av feilen.
  • I set_age() hvis alderen er utenfor det gyldige området (0–120), økes unntaket.
  • Prøv-unntatt-blokken fanger opp unntaket og skriver ut feilmeldingen.

Tilpasse unntaksklasser

Når vi lager et tilpasset unntak, underklasser vi Pythons innebygde unntaksklasse (eller en underklasse som ValueError TypeError osv.). Vi kan deretter legge til våre egne attributtmetoder eller tilpasset logikk for å gjøre unntaket vårt mer informativt.

Vi kan også forbedre tilpassede unntak ved å legge til ekstra attributter eller overstyre metoder.

Eksempel: Her forbedrer vi InvalidAgeError ved å legge til en feilkode og tilpasse feilmeldingen.

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  )   

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

Forklaring:

  • InvalidAgeError har nå et ekstra attributt error_code.
  • __str__-metoden overstyres for å vise både feilkoden og alderen.
  • Når set_age(150) utføres, heves unntaket og fanges opp i try-except-blokken.
  • Den tilpassede feilmeldingen skrives ut, noe som gjør feilen mer beskrivende.

Bruk av standard unntak som en basisklasse

Noen ganger i stedet for direkte å arve fra Exception kan vi lage et tilpasset unntak ved å underklassifisere et standard unntak som RuntimeError ValueError osv. Dette er nyttig når det tilpassede unntaket ditt skal behandles som en spesifikk type feil.

Eksempel: Dette eksemplet viser hvordan du oppretter et tilpasset unntak NetworkError ved å arve fra RuntimeError som er et standard innebygd unntak.

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  )   

Produksjon
('Connection failed')  

Forklaring:

  • NetworkError arver fra RuntimeError som er en innebygd unntakstype.
  • Når den heves, lagres meldingen i args-attributtet som en tuppel.
  • Unntaket fanges opp og dets lagrede argumenter vises.

Eksempel fra den virkelige verden: Ugyldig e-postfeil

Her er et enkelt eksempel der vi tar opp et tilpasset unntak hvis e-postadressen ikke er gyldig:

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  )   

Produksjon
userexample.com -> Invalid email format  

Forklaring:

  • En ny unntaksklasse InvalidEmailError er definert for å validere e-postadresser.
  • Hvis den gitte e-posten ikke inneholder '@', oppstår unntaket.
  • Prøv-unntatt-blokken fanger opp feilen og skriver ut den formaterte meldingen.

Når skal man bruke brukerdefinerte unntak?

Brukerdefinerte unntak bør vurderes i følgende scenarier:

  • Representerer spesifikke feil i en applikasjon (f.eks. InvalidAgeError DatabaseConnectionError).
  • Gir klarere og mer beskrivende feilmeldinger.
  • Håndtere en gruppe relaterte feil separat ved å bruke unntatt.

Ved å bruke brukerdefinerte unntaksprogrammer blir programmer mer lesbare vedlikeholdbare og enklere å feilsøke.

Foreslått quiz Rediger Quiz 3 spørsmål

Hva skjer hvis et brukerdefinert unntak arver fra RuntimeError i stedet for unntak?

  • EN

    Den kan ikke fanges med annet enn

  • B

    Det blir et ukontrollert unntak

  • C

    Den blir behandlet som en kjøretidsrelatert feil av behandlere

  • D

    Den mister egendefinerte attributter

Forklaring:

Ved å arve fra RuntimeError kan den håndteres som en kjøretidsfeil så vel som en egendefinert.

Hvorfor brukes super().__init__(self.msg) ofte i tilpassede unntaksklasser?

  • EN

    For å forhindre multippel arv

  • B

    For å initialisere grunnunntaksklassen på riktig måte

  • C

    For å overstyre tilbakesporingen

  • D

    For å automatisk heve unntaket

Forklaring:

Å ringe super() sikrer at grunnunntaket initialiseres riktig med meldingen.

Hva vil bli skrevet ut hvis et tilpasset unntak overstyrer __str__() og skrives ut inni unntatt?

  • EN

    Den overstyrte strengrepresentasjonen

  • B

    Minneadressen til unntaket

  • C

    Bare klassenavnet

  • D

    Ingenting med mindre repr() brukes

Forklaring:

print(e) kaller __str__() av ​​unntaksobjektet.

Brukerdefinerte unntak i Python med eksemplerQuiz fullførte poengsummen din:   2 /3 Nøyaktighet:  0 % Logg inn for å se forklaring 1 /3 1 /3 < Previous Neste >