I denne vejledning lærer du, hvordan du håndterer undtagelser i dit Python-program ved hjælp af try, undtagen og endelig udsagn ved hjælp af eksempler.
Video: Python Exception Handling (prøv … undtagen … endelig)
Undtagelser i Python
Python har mange indbyggede undtagelser, der hæves, når dit program støder på en fejl (noget i programmet går galt).
Når disse undtagelser forekommer, stopper Python-tolken den aktuelle proces og overfører den til opkaldsprocessen, indtil den håndteres. Hvis det ikke håndteres, går programmet ned.
Lad os for eksempel overveje et program, hvor vi har en funktion, A
der kalder funktion B
, som igen kalder funktion C
. Hvis en undtagelse forekommer i funktion, C
men ikke håndteres C
, overføres undtagelsen til B
og derefter til A
.
Hvis det aldrig håndteres, vises en fejlmeddelelse, og vores program stopper pludselig uventet.
Fanger undtagelser i Python
I Python kan undtagelser håndteres ved hjælp af en try
erklæring.
Den kritiske operation, der kan skabe en undtagelse, er placeret inde i try
klausulen. Koden, der håndterer undtagelserne, er skrevet i except
klausulen.
Vi kan således vælge, hvilke operationer der skal udføres, når vi har fanget undtagelsen. Her er et simpelt 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)
Produktion
Posten er en Ups! fandt sted. Næste post. Posten er 0 Ups! opstod. Næste post. Posten er 2 Den gensidige på 2 er 0,5
I dette program løber vi gennem værdierne i listen randomList. Som tidligere nævnt placeres den del, der kan forårsage en undtagelse, inde i try
blokken.
Hvis der ikke forekommer nogen undtagelse, except
springes blokken over, og normal strøm fortsætter (for sidste værdi). Men hvis der sker en undtagelse, fanges den af except
blokken (første og anden værdi).
Her udskriver vi navnet på undtagelsen ved hjælp af exc_info()
funktionen inde i sys
modulet. Vi kan se, at a
årsager ValueError
og 0
årsager ZeroDivisionError
.
Da enhver undtagelse i Python arver fra baseklassen Exception
, kan vi også udføre ovenstående opgave på følgende måde:
# 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 program har samme output som ovenstående program.
Fange specifikke undtagelser i Python
I ovenstående eksempel nævnte vi ingen specifik undtagelse i except
klausulen.
Dette er ikke en god programmeringspraksis, da det fanger alle undtagelser og håndterer alle sager på samme måde. Vi kan specificere, hvilke undtagelser en except
klausul skal fange.
En try
klausul kan have et vilkårligt antal except
klausuler til at håndtere forskellige undtagelser, men kun en vil blive udført, hvis en undtagelse forekommer.
Vi kan bruge en gruppe værdier til at angive flere undtagelser i en undtagelsesklausul. 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
At hæve undtagelser i Python
I Python-programmering hæves undtagelser, når der opstår fejl ved kørsel. Vi kan også manuelt hæve undtagelser ved hjælp af raise
nøgleordet.
Vi kan valgfrit overføre værdier til undtagelsen for at afklare, hvorfor denne undtagelse blev rejst.
>>> 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 andet klausul
I nogle situationer vil du muligvis køre en bestemt kodeblok, hvis kodeblokken inde try
kørte uden fejl. I disse tilfælde kan du bruge det valgfri else
nøgleord sammen med try
udsagnet.
Bemærk : Undtagelser i den anden klausul håndteres ikke af den foregående undtagen klausuler.
Lad os 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)
Produktion
Hvis vi passerer et ulige tal:
Indtast et tal: 1 Ikke et lige tal!
Hvis vi passerer et lige tal, beregnes og vises det gensidige.
Indtast et tal: 4 0,25
Men hvis vi passerer 0, får vi, ZeroDivisionError
da kodeblokken indeni else
ikke håndteres af 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 type konstruktion sørger for, at filen lukkes, selvom der sker en undtagelse under programudførelsen.