Hvordan håndtere unntak i python

Det er svært vanlig å oppleve feil under utførelsen av et program. To vanlige typer feil som du kanskje må håndtere, er syntaksfeil og unntak. Syntaksfeil oppstår når du skriver inn koden feil. I slike tilfeller gjentas den feilaktige linjen av parseren med en pil som peker til den tidligste plasseringen der feilen ble oppdaget.

Unntak er forskjellig fra syntaksfeil. De oppstår under utførelsen av et program når noe uventet skjer. For eksempel, la oss si at du ber brukeren om å skrive inn et nummer for å utføre en divisjon. Nå, hvis brukeren kommer inn i en streng i stedet for et tall, og du prøver å dele et tall med den oppgitte inngangen, vil programmet sende ut en Typeerror

Når du ikke håndterer unntak, vil programmet plutselig slutte som det ikke vet hva du skal gjøre i slike tilfeller. Følgende kode er et slikt eksempel:

keep_asking = True while keep_asking: x = int (input ("Skriv inn et nummer:")) print ("Dividing 50 by", x, "gir deg:", 50 / x)

Så lenge du legger inn en integrert inngangsverdi, vil programmet fungere riktig. Men så snart du skriver inn en streng eller til og med et desimalnummer som input, får du en ValueError unntak.

I denne opplæringen lærer du hvordan du skal håndtere og hente unntak i Python.

Noen vanlige unntak

Her er noen grunnleggende unntak som du kanskje støter på når du skriver programmer. Du kan lese om mange flere innebygde unntak på den offisielle nettsiden.

  • NameError: Dette unntaket heves når programmet ikke finner et lokalt eller globalt navn. Navnet som ikke ble funnet, er inkludert i feilmeldingen.
  • Typeerror: Dette unntaket heves når en funksjon er bestått en gjenstand av den upassende typen som argument. Flere detaljer om feil type finnes i feilmeldingen.
  • ValueError: Dette unntaket oppstår når et funksjonsargument har riktig type, men en upassende verdi. 
  • NotImplementedError: Dette unntaket heves når et objekt skal støtte en operasjon, men det er ikke implementert ennå. Du bør ikke bruke denne feilen når den oppgitte funksjonen ikke er ment å støtte typen av inngangsargument. I disse situasjonene, heve en Typeerror unntak er mer hensiktsmessig.
  • ZeroDivisionError: Dette unntaket blir hevet når du gir det andre argumentet for en divisjon eller modulo-operasjon som null.
  • FileNotFoundError: Dette unntaket heves når filen eller katalogen som programmet forespurte ikke eksisterer.

Akkurat som navnene ovenfor har de fleste unntak selvforklarende navn.

Håndtere en unntak

Koden i begynnelsen av artikkelen ba brukere legge inn et heltall som input. Hvis brukeren ikke oppgav et heltallinngang, stoppet programmet kjøring og hevet et unntak for verdifeil. I denne delen skriver vi noen kode for å fortelle brukeren at deres inntasting ikke er en gyldig heltallverdi.

Det første trinnet i prosessen er å inkludere koden du tror kan gi et unntak inne i prøve klausul. Det neste trinnet er å bruke unntatt søkeord for å håndtere unntaket som skjedde i koden ovenfor. Den endrede koden for brukerinngangen vil se slik ut:

keep_asking = True while keep_asking: prøv: x = int (input ("Vennligst skriv inn et nummer:")) print ("Dividing 50 by", x, "gir deg:", 50 / x) bortsett fra ValueError: print Inngangen var ikke et heltall. Vennligst prøv igjen ... ")

Hva som skjer her er at programmet forsøker å utføre koden inne i prøve klausul. Hvis ikke noe unntak ble hevet, hopper programmet over unntatt klausul og resten av koden kjøres normalt. Hvis et unntak er hevet, hopper programmet over den gjenværende koden inne i prøve klausul og typen unntaket samsvarer med navnet på unntaket etter unntatt søkeord. I tilfelle en kamp, ​​koden inne i unntatt Klausulen utføres først, og deretter resten av koden etter prøve Klausulen utføres normalt.

Når du skriver inn et heltall som en inngang, gir programmet deg det endelige resultatet av divisjonen. Når en ikke-integrert verdi er gitt, skriver programmet en melding som ber deg om å prøve å skrive inn et heltall igjen. Merk at denne gangen, slutter programmet ikke abrupt når du oppgir noe ugyldig inngang.

Du kan ha flere unntatt klausuler for å håndtere ulike unntak. Vær oppmerksom på at disse håndterer kun vil ta seg av unntak som skjedde i det tilsvarende prøve klausul. De vil ikke håndtere noen unntak som er opphøyd innen andre unntakshåndterere.

Du kan også håndtere flere unntak ved å bruke en enkelt unntatt klausul ved å overføre disse unntakene til klausulen som a tuppel.

bortsett fra (ZeroDivisionError, ValueError, TypeError): print ("Noe har gått galt ...") # kode for å håndtere unntaket

Til slutt kan du også legge ut navnet på unntaket etter unntatt søkeord. Dette anbefales vanligvis ikke, da koden nå skal fange alle unntakene og håndtere dem på samme måte. Dette er ikke optimalt da du skal håndtere en Typeerror unntak på samme måte som du ville ha håndtert a ZeroDivisionError unntak. Når du håndterer unntak, er det bedre å være så spesifikk som mulig og bare ta tak i det du kan håndtere.

En mulig bruk av å fange alle unntak er å skrive ut unntaksfeilen på skjermen som følgende kode:

importer matematikk import sys try: result = math.factorial (2.4) bortsett fra: print ("Noe uventet har skjedd.", sys.exc_info () [0]) ellers: print ("Factorial er", resultat)

Bruke Else-klausulen

Du kan også bruke en ellers klausul i a prøv ... bortsett fra uttalelse. De ellers Klausulen er ment å inneholde kode som må utføres hvis prøve klausulen gjorde ikke noen unntak. Dette kan være nyttig for å sørge for at du ikke legger til noen kode i prøve blokkere hvis unntak du ikke har tenkt å fange. En ting verdt å nevne er at hvis du bestemmer deg for å bruke en ellers klausul, bør du inkludere det etter alle unntatt klausuler, men før endelig blokkere.

I vårt tilfelle kan vi flytte linjen som skriver ut resultatet av divisjonen vår i ellers blokkere.

keep_asking = True while keep_asking: prøv: x = int (input ("Vennligst skriv inn et nummer:")) unntatt ValueError: print ("Inngangen var ikke et gyldig heltall. Vennligst prøv igjen ...") ellers: print med ", x," vil gi deg: ", 50 / x)

Rengjøring opp med sluttklausulen

La oss si at du har skrevet noen kode inni prøve blokkere som skal utføre en oppgave ved å bruke en stor mengde ressurser. Det er viktig å frigjøre disse ressursene tilbake når du er ferdig med å bruke dem. Dette kan lett oppnås ved å bruke endelig klausul. 

Koden inne i endelig Klausulen utføres alltid uavhengig av om prøve blokk hevet et unntak. Du kan bekrefte dette ved å kjøre følgende kode:

keep_asking = True while keep_asking: prøv: x = int (input ("Vennligst skriv inn et nummer:")) unntatt ValueError: print ("Inngangen var ikke et gyldig heltall. Vennligst prøv igjen ...") ellers: print med ", x," vil gi deg: ", 50 / x) endelig: print (" Allerede gjorde alt som er nødvendig. ")

Hvis noen av unntatt klausuler du spesifiserte ikke håndterer det hevede unntaket, blir det samme unntaket reist igjen etter kjøring av kode inne i endelig blokkere.

Et mer komplekst eksempel

I denne delen skriver vi et program for å håndtere flere unntak. På samme måte som de foregående eksemplene, skal vi utføre noen matematiske operasjoner. Men denne gangen tar vi innspillet fra en liste.

Følgende kode sjekker for to unntak, Typeerror og ValueError. De ellers blokk brukes til å skrive ut faktorial. Du kan se i utgangen at denne koden er utført bare når det ikke oppstår noe unntak.

importer matematikk number_list = [10, -5,1.2, 'apple'] for nummer i number_list: prøv: number_factorial = math.factorial (tall) unntatt TypeError: print ("Faktor er ikke støttet for gitt inngangstype.") bortsett fra ValueError : print ("Factorial aksepterer bare positive heltallverdier.", tall, "er ikke et positivt heltall.") ellers: Skriv ut ("Faktor av", tall, "er", tallfaktor) i bruk.")

Ovennevnte kode gir følgende utgang:

Faktoriet på 10 er 3628800 Løsning av ressurser som er i bruk. Factorial aksepterer bare positive heltallverdier. -5 er ikke et positivt heltall. Løse eventuelle ressurser i bruk. Factorial aksepterer bare positive heltallverdier. 1.2 er ikke et positivt heltall. Løse eventuelle ressurser i bruk. Factorial støttes ikke for gitt inngangstype. Løse eventuelle ressurser i bruk.

En annen ting verdt å merke seg er at koden inne i endelig Klausulen utføres for hvert element i listen.

Siste tanker

Jeg håper denne opplæringen hjalp deg med å forstå unntakshåndtering i Python. I tillegg, ikke nøl med å se hva vi har tilgjengelig for salg og for studier på markedet, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved hjelp av feedet under.

Riktig håndtering av unntak kan være svært nyttig i situasjoner der et program avsluttes etter at det mottar en uventet innføring, ikke er levedyktig. Hvis du har spørsmål angående unntakshåndtering i Python, vennligst gi meg beskjed i kommentarene. 

Lær python

Lær Python med vår komplette pythonveiledning, enten du er bare i gang eller du er en erfaren coder som ønsker å lære nye ferdigheter..