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.
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.
Typeerror
unntak er mer hensiktsmessig.Akkurat som navnene ovenfor har de fleste unntak selvforklarende navn.
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)
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)
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.
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.
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 med vår komplette pythonveiledning, enten du er bare i gang eller du er en erfaren coder som ønsker å lære nye ferdigheter..