python try except python handling exception with examples
Denne opplæringen forklarer Unntakshåndtering i Python ved hjelp av Try Except-blokken ved hjelp av programmeringseksempler:
To feiltyper kan føre til at et Python-program stopper brått, dvs. Syntaksfeil , og Unntak . I denne opplæringen vil vi diskutere den andre feiltypen (Unntak) under flere viktige emner.
Vi vil ha stor nytte av å håndtere unntak i søknaden vår, for eksempel:
- Opprette en robust applikasjon.
- Opprette en ren og feilfri kode.
=> Besøk her for den eksklusive opplæringsserien for Python Training
Hva du vil lære:
- Python Prøv unntatt
- Vanlige Python-unntak
- Konklusjon
Python Prøv unntatt
En god nyhet er at Python har et stort antall innebygde unntak for å fange feil i koden vår. Det gir oss også muligheten til å lage tilpassede unntak når ingen av de innebygde unntakene passer til våre behov.
Hva er et unntak
Så hva er et unntak i Python? Enkelt sagt, når Python-tolk prøver å utføre ugyldig kode, reiser det et unntak, og i tilfeller der et slikt unntak ikke blir håndtert, forstyrrer det den normale strømmen av programmets instruksjoner og skriver ut en sporbarhet.
La oss lage en ugyldig kode og se hvordan Python-tolk vil svare.
Åpne et Python-skall og kjør følgende kode.
>>> 50/0
Dette er en av de vanligste feilene i programmeringen. Ovennevnte kode prøver å dele tallet femti av 0 (null). Python-tolken ser på dette som en ugyldig operasjon og reiser en ZeroDivisionError , forstyrrer programmet og skriver ut et spor.
Det kan vi tydelig se ZeroDivisionError er unntaket som ble reist. Det er faktisk Pythons egen måte å fortelle oss at det ikke er kult å dele et tall med null. Selv om det er andre feil som JavaScript, er dette ikke en feil. og python forbyr denne praksisen strengt tatt.
Det er også viktig å vite at dette bare er et unntaksobjekt, og Python har mange slike objekter innebygd. Sjekk ut denne Python-tjenestemannen dokumentasjon for å se alle Python innebygde unntak.
Forstå sporing
Før vi begynner å håndtere unntak, tror jeg det vil hjelpe å forstå hva som vil skje hvis unntak ikke håndteres, og hvordan Python gjør sitt beste for å informere oss om feilen vår.
Hver gang Python støter på en feil, gir det et unntak. Hvis dette unntaket ikke håndteres, produserer det litt informasjon kalt Traceback. Så, hvilken informasjon inneholder denne sporingen?
Det inneholder:
- Feilmeldingen som forteller oss hvilket unntak som ble reist og hva som skjedde før dette unntaket ble reist.
- De forskjellige linjenumrene til koden som forårsaket denne feilen. En feil kan være forårsaket av en rekke funksjonsanrop kalt a ringestabel som vi vil diskutere senere her.
Selv om det er litt forvirrende, lover vi at neste eksempel vil bringe mer lys til vår forståelse.
Husk traceback som ble skrevet ut fra å dele 50 med 0 ovenfor, vi kan se at traceback inneholder følgende informasjon:
- Fil “”: Dette forteller oss at denne koden ble kjørt fra en konsollterminal.
- linje 1: Dette forteller oss at feilen oppstod i dette linjenummeret.
- ZeroDivisionError: divisjon av null: Den forteller oss hvilket unntak som ble reist og hva som forårsaket det.
La oss prøve et annet eksempel og kanskje se hvordan en ringestabel ser ut som. Åpne en redaktør, skriv inn koden nedenfor og lagre som tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
Åpne en terminal i katalogen der denne filen finnes og kjøres.
python tracebackExp.py
Du vil se følgende traceback:
Ovenstående sporbarhet kan virke forvirrende, men egentlig er det ikke. Pythonistas kom opp med den beste måten å lese traceback, som er fra opp ned . Så la oss bruke denne visdommen til å prøve å forstå hva denne sporingen har å tilby.
- Nederst får vi unntaket som ble hevet og hvorfor det ble hevet.
- Når vi går opp, får vi filnavnet tracebackExp .py hvor denne feilen oppstod, beregningen som forårsaket denne feilen beregne = numb / div, funksjonen stack2 og koblingsnummerlinjen 6 der denne beregningen ble utført.
- Når vi beveger oss oppover, ser vi at stack2-funksjonen vår ble kalt i funksjonen stack1 i linje nummer 3.
- Når vi går til det øverste, ser vi at funksjonen stack1 ble kalt på linje nummer 11.< modul > forteller oss at det er filen som kjøres.
Vanlige Python-unntak
Python-biblioteket definerer veldig mange innebygde unntak. Du kan sjekke Python-dokumentasjonen eller ringe den innebygde lokal () fungerer som nedenfor:
>>> dir(locals()('__builtins__'))
Vi vil ikke prøve å adressere alle disse unntakene, men vi vil se noen vanlige unntak som du sannsynligvis vil komme over.
# 1) TypeError
Den heves når en operasjon eller funksjon brukes på et objekt av upassende type.
Eksempel 1
Tenk på programmet nedenfor. Det tar inn et utbytte og deler, deretter beregner og skriver resultatet av å dele utbyttet med deleren.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
Vi ber om verdien av utbyttet og divisoren fra brukeren, men vi glemmer å kaste divisorens strengverdi i et helt tall. Så vi ender med at utbyttetypen er heltall ( int ) og skilletype som er streng ( s ). Vi får deretter Type Feil ettersom divisjonsoperatøren (/) ikke opererer på strenger.
Det kan interessere deg å vite at i motsetning til Python har Javascript Type-tvang som i utgangspunktet konverterer en av operandens typer til en ekvivalent verdi av den andre operandens type når operandene er av forskjellige typer.
# 2) Verdifeil
Dette heves når en operasjon eller funksjon mottar et argument som har riktig type, men en upassende verdi.
Eksempel 2
Tenk på programmet vårt i Eksempel 1 ovenfor.
Hvis brukeren legger inn en alfanumerisk verdi for utbyttet som ‘3a’, vil programmet vårt heve ValueError-unntaket. Dette er fordi, selv om Python int () metoden tar inn et hvilket som helst tall eller streng og returnerer et helt tallobjekt, strengverdien skal ikke inneholde bokstaver eller noen ikke-numerisk verdi.
# 3) AttributeError
Dette unntaket heves når du tilordner eller refererer til et attributt som ikke eksisterer.
Eksempel 3
Tenk på programmet nedenfor. Det tar inn et tall og beregner kvadratroten ved hjelp av Python matematikkmodul
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root
Når en bruker skriver inn et tall, prøver vårt program å bruke en funksjon fra matematikkmodulen til å beregne kvadratroten, men akkurat det her, vi gjorde en feil. I stedet for sqrt skrev vi feilaktig sqr som ikke finnes i matematikkmodulen.
Så vi prøvde å referere til et attributt sqr som ikke eksisterer, og førte til at unntaket AttributeError ble hevet. De fleste av oss gjør denne typen feil mye. Så du er ikke alene.
Håndtering av unntak med Prøv unntatt
Som programmerer er en ting som de fleste av oss vil bruke tiden vår på å skrive en robust kode som er motstandsdyktig. Kode som ikke går i stykker på grunn av noen feil. I Python kan vi oppnå dette ved å legge inn uttalelsene våre i a prøve - unntatt uttalelse.
Python Try-Except-uttalelse
Uttrykket med unntak av unntak har følgende struktur:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
La oss legge ved koden tracebackExp .py inne i en prøve unntatt uttalelse.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15
Å kjøre denne koden vil produsere utdataene
Slik fungerer utsagnet unntatt. Python utfører koden i prøveblokken linje 7-8 . Hvis det ikke blir funnet noen ugyldig kode, blir koden i unntatt blokken linje 10 blir hoppet over og kjøringen fortsetter.
Men hvis en ugyldig kode blir funnet, stopper kjøringen umiddelbart i prøveblokken og sjekker om unntaket som heves samsvarer med den vi ga i unntakssetningen linje 9 . Hvis den stemmer overens, blir den unntatte blokken utført og fortsetter. Hvis den ikke gjør det, vil programmet avbryte.
Try-blokken inneholder vanligvis koden som kan gi et unntak mens unntaksblokken fanger og håndterer unntaket.
Håndtere flere unntak unntatt
Vi kan håndtere flere unntak med enten ett unntak eller flere unntak. Alt avhenger av hvordan du vil håndtere hvert unntak.
# 1) Håndtering av flere unntak med ett unntak
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Denne metoden brukes når vi mistenker at koden vår kan gi forskjellige unntak, og vi ønsker å ta samme handling i hvert tilfelle. Så hvis Python-tolk finner et samsvar, vil koden skrevet i unntatt blokken kjøres.
La oss vurdere eksemplet på Python-koden nedenfor
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex)
Vi har to mulige unntak som kan heves her, ZeroDivisionError og IndexError . Hvis noen av disse unntakene blir hevet, vil den unntatte blokken bli utført.
I koden ovenfor, idx = 3, så idx_ verdi blir 0 og verdi / idx_ verdi vil heve ZeroDivisionError
# 2) Håndtering av flere unntak med flere unntak
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Hvis vi heller vil håndtere hvert unntak separat, så kan du gjøre det.
Tenk på eksemplet Python-koden nedenfor
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex
Vi merker her at Unntak ble brukt i den siste unntakssetningen. Dette er fordi unntaksobjektet Unntak samsvarer med ethvert unntak. Av denne grunn bør det alltid være sist, siden Python slutter å sjekke andre unntakshåndterere når en matcher.
I koden ovenfor, idx = 5 , derav arr (idx) vil heve IndexError fordi idx er større enn lengden på listen arr
Ikke sikker på hvilket unntak som ble reist av søknaden din, er aldri trygt for å fortsette kjøringen. Derfor har vi typen Unntak for å fange eventuelle uforutsagte unntak. Deretter informerer vi brukeren og avbryter applikasjonen ved å heve det samme unntaket.
Prøv Else Statement
Dette er en valgfri funksjon av unntakshåndtering og lar deg legge til kode som du ønsker å kjøre når ingen feil oppstod. Hvis det oppstår en feil, kjører ikke denne andre blokken.
Tenk på eksemplet Python-koden nedenfor, åpne redaktøren og lagre koden som elseTry.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break
Vi får innspill fra brukeren og bruker den til å dele 1. Vi har to mulige unntak her, en ugyldig brukerinngang som vil forårsake ValueError og en null (0) som vil forårsake ZeroDivisionError . Vår unntatt uttalelse håndterer disse feilene.
Nå vil vi skrive ut verdien av verdi . Vår andre-blokk sørger for at den bare skrives ut hvis vår prøveblokk kjøres uten feil. Dette er viktig fordi hvis det oppstår en feil i prøveblokken vår, verdi vil være udefinert. Så å få tilgang til det vil føre til en annen feil.
Kjør koden ovenfor med Python elseTry.py
Utgangen ovenfor viser at vi for den første inngangen skrev 0 og trykk ENTER. Siden divisoren vår mottok 0, reiste 1 / divisor zeroDivisionError . Den andre inngangen vår var k som er ugyldig for int (), derav unntaket ValueError blir hevet.
Men vår siste innspill var 9 som er gyldig, og som et resultat fikk vi verdien av ' verdi ”Trykt som 0.1111111111111111
Prøv Endelig uttalelse
Dette er også en valgfri funksjon av unntakshåndtering og vil alltid kjøre uansett hva som skjer i unntakshåndtererne.
Det er:
- Hvorvidt et unntak oppstår eller ikke
- Selv om det kalles ‘retur’ i de andre blokkene.
- Selv om manuset er avsluttet i de andre blokkene
Så hvis vi har en kode som vi vil kjøre i alle situasjoner, er endelig block vår fyr. Denne blokken brukes mest til opprydding som å lukke filer.
Tenk på eksemplet Python-koden nedenfor
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Denne koden prøver å åpne og lese filen text.txt i den nåværende katalogen. Hvis filen eksisterer, vil programmet vårt skrive ut den første linjen i filen, og vår endelige blokk vil kjøre og lukke filen.
Si at vi har en fil som heter text.txt i katalogen der denne programfilen er og inneholder Hello. Hvis vi kjører programmet, får vi utdataene
Dette eksemplet ble valgt med vilje fordi jeg ønsket at vi skulle løse et lite problem som kan oppstå når du lukker filer i den endelige blokken.
Hvis filen ikke eksisterer, unntaket FileNotFoundError vil bli hevet og variabelen åpen fil vil ikke bli definert og vil ikke være et filobjekt. Derfor vil det å prøve å lukke det i endelig blokkering heve et unntak Ubundet Lokalfeil som er en underklasse av NameError .
Dette sier i utgangspunktet at vi prøver å referere til variabelen åpen fil før den er tildelt.
Et lite triks her er å bruke unntakshåndterere inne i endelig blokken.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Hvis vår prøveblokk øker FileNotFoundError, vil vi ha følgende utdata
Hev unntak
En god nyhet om unntak fra Python er at vi med vilje kan heve dem. Unntak heves med løfte uttalelse .
Hevingsuttalelsen har følgende syntaks:
raise (ExceptionName((*args: Object)))
Åpne en terminal og løft unntaksobjekter fra Python innebygde unntak. For eksempel, hvis vi hever ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Vi får sporingen:
Så hvorfor er det viktig å heve unntak?
- Når du arbeider med tilpassede unntak.
- Under sunnhetssjekker.
Egendefinerte unntaksklasser
Et tilpasset unntak er et du oppretter for å håndtere feil som er spesifikke for ditt behov. Trikset er at vi definerer en klasse som kommer fra objektet Unntak , så bruker vi hevingsuttalelsen til å heve unntaksklassen.
Anta at vi vil sjekke brukerinngangen og sørge for at inngangsverdien ikke er negativ (sunnhetssjekk). Selvfølgelig kan vi heve Python-unntaket ValueError, men vi vil tilpasse feilen ved å gi den et spesifikt og selvforklarende navn som InputIsNegativeError . Men dette unntaket er ikke et Python-innebygd unntak.
Så først lager vi vår basisklasse som kommer fra unntak.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Deretter oppretter vi vår unntaksklasse som vil arve basisklassen og håndtere den spesifikke feilen vår.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
La oss teste dette
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Ovennevnte kodeforespørsel for brukerinngang, og sjekk om den er negativ. Hvis det er sant, hever det vårt tilpassede unntak InputIsNegativeError som senere blir fanget i unntaksuttalelsen.
Nedenfor er den fullstendige koden:
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Hvis inngangsverdien er et negativt tall som -1, vil vi ha utdataene:
hvordan du viser dat-filer på Windows
Sjekk ut Python doc for mer informasjon om tilpassede Python-unntak.
ofte stilte spørsmål
Sp # 1) Hvordan håndterer Python et unntak?
Svar: Python håndterer unntak ved hjelp av prøve unntatt uttalelse . Koden som kan heve et unntak plasseres og kjøres i prøv å blokkere mens unntatt blokk har koden som vil håndtere unntakene hvis noen oppstår.
Q # 2) Hva hevder et unntak i Python?
Svar: Hver gang Python-tolk møter en ugyldig kode, reiser det et unntak, som er Pythons egen måte å fortelle oss at noe uventet skjedde. Vi kan også med vilje heve unntak ved å bruke løfte uttalelse .
Spørsmål 3) Hvordan håndterer Python flere unntak?
Svar: Python håndterer flere unntak ved å bruke enten en enkelt unntatt blokk eller flere unntatt blokker.
For en enkelt blokk sendes unntakene som en tuple: unntatt (Exception1, Exception2, .., ExceptionN) og Python ser etter en kamp fra høyre til venstre. I dette tilfellet iverksettes det samme for hvert unntak.
En annen måte å fange alle unntak på er å utelate navnet på unntaket etter det unntatte nøkkelordet.
except: # handle all exceptions here
Den andre måten er å bruke en unntaksblokk for hvert unntak:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
På denne måten kan du ta separate handlinger for hvert unntak.
Spørsmål 4) Hvorfor er unntakshåndtering viktig i Python?
Svar: Fordelen med å håndtere unntak i Python er at vi kan lage robuste, rene og feilfrie applikasjoner. Vi vil ikke at produksjonskoden vår skal krasje på grunn av noen feil, så vi håndterer feilene og holder applikasjonen i gang.
Sp # 5) Hvordan ignorerer du et unntak i Python?
Svar: For å ignorere et unntak i Python, bruk sende nøkkelord i unntatt blokk. La oss si at vi vil ignorere ValueError-unntaket. Vi vil gjøre det på denne måten:
except ValueError: pass
Med mindre du vet hva du gjør, er det dårlig praksis å ignorere unntak. Informer i det minste brukeren om alle potensielle feil.
Konklusjon
I denne opplæringen dekket vi: Python Exceptions, Traceback; hvordan håndtere unntak med Prøve / Unntatt / Ellers / Endelig blokker, hvordan Hev Unntak, og til slutt hvordan du lager våre egne tilpassede unntak.
Takk for at du leste!
=> Besøk her for å lære Python fra Scratch.
Anbefalt lesing
- Python-opplæring for nybegynnere (praktisk GRATIS Python-trening)
- Uttalelser om Python-kontroll (Python fortsetter, bryter og passerer)
- Python DateTime Tutorial med eksempler
- Python-strengfunksjoner
- Python-variabler
- C # Exception Handling Tutorial med kodeeksempler
- Komplett guide til håndtering av PL SQL-unntak med eksempler
- Java-unntak og unntakshåndtering med eksempler