I denne opplæringen lærer du hvordan du håndterer unntak i Python-programmet ditt ved å prøve, unntatt og til slutt uttalelser ved hjelp av eksempler.
Video: Python Exception Handling (prøv … bortsett fra … endelig)
Unntak i Python
Python har mange innebygde unntak som heves når programmet støter på en feil (noe i programmet går galt).
Når disse unntakene oppstår, stopper Python-tolk den nåværende prosessen og overfører den til anropsprosessen til den blir håndtert. Hvis det ikke håndteres, vil programmet krasje.
La oss for eksempel se på et program der vi har en funksjon A
som kaller funksjon B
, som igjen kaller funksjon C
. Hvis et unntak oppstår i funksjon, C
men ikke håndteres i det C
, overføres unntaket til B
og deretter til A
.
Hvis det aldri blir håndtert, vises en feilmelding, og programmet stopper plutselig uventet.
Fanger unntak i Python
I Python kan unntak håndteres ved hjelp av en try
uttalelse.
Den kritiske operasjonen som kan gi unntak er plassert inne i try
paragrafen. Koden som håndterer unntakene er skrevet i except
paragrafen.
Vi kan dermed velge hvilke operasjoner vi skal utføre når vi har fått unntaket. Her er et enkelt eksempel.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Produksjon
Oppføringen er en Ups! skjedde. Neste oppføring. Oppføringen er 0 Ups! oppstod. Neste oppføring. Oppføringen er 2 Den gjensidige av 2 er 0,5
I dette programmet går vi gjennom verdiene i listen randomly. Som tidligere nevnt, plasseres den delen som kan forårsake unntak inne i try
blokken.
Hvis det ikke forekommer noe unntak, except
hoppes blokken over og normal flyt fortsetter (for siste verdi). Men hvis det oppstår unntak, blir det fanget av except
blokken (første og andre verdier).
Her skriver vi ut navnet på unntaket ved hjelp av exc_info()
funksjonen i sys
modulen. Vi kan se at a
årsaker ValueError
og 0
årsaker ZeroDivisionError
.
Siden hvert unntak i Python arver fra baseklassen Exception
, kan vi også utføre oppgaven ovenfor på følgende måte:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Dette programmet har samme utgang som programmet ovenfor.
Fange spesifikke unntak i Python
I eksemplet ovenfor nevnte vi ikke noe spesifikt unntak i except
paragrafen.
Dette er ikke god programmeringspraksis, da det vil fange alle unntak og håndtere alle tilfeller på samme måte. Vi kan spesifisere hvilke unntak en except
klausul skal fange.
En try
klausul kan ha et hvilket som helst antall except
klausuler for å håndtere forskjellige unntak, men bare en vil bli utført i tilfelle et unntak oppstår.
Vi kan bruke en mengde verdier for å spesifisere flere unntak i en unntatt ledd. Her er et eksempel på en pseudokode.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Å heve unntak i Python
I Python-programmering heves unntak når feil oppstår ved kjøretid. Vi kan også manuelt heve unntak ved å bruke raise
nøkkelordet.
Vi kan eventuelt overføre verdier til unntaket for å avklare hvorfor unntaket ble reist.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Python prøv med annet ledd
I noen situasjoner vil du kanskje kjøre en bestemt blokk med kode hvis kodeblokken try
kjørte uten feil. I disse tilfellene kan du bruke det valgfrie else
nøkkelordet sammen med try
utsagnet.
Merk : Unntak i den andre klausulen håndteres ikke av de foregående unntatt klausulene.
La oss se på et eksempel:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Produksjon
Hvis vi passerer et oddetall:
Skriv inn et tall: 1 Ikke et partall!
Hvis vi passerer et partall, blir gjensidige beregnet og vist.
Skriv inn et tall: 4 0,25
Imidlertid, hvis vi passerer 0, får vi ZeroDivisionError
ettersom kodeblokken inne else
ikke blir håndtert av foregående except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Denne typen konstruksjon sørger for at filen lukkes selv om det oppstår et unntak under programutførelsen.