I den här handledningen lär du dig hur du hanterar undantag i ditt Python-program med try, utom och slutligen uttalanden med hjälp av exempel.
Video: Python Exception Handling (prova … utom … äntligen)
Undantag i Python
Python har många inbyggda undantag som tas upp när ditt program stöter på ett fel (något i programmet går fel).
När dessa undantag inträffar stoppar Python-tolk den aktuella processen och skickar den till anropsprocessen tills den hanteras. Om det inte hanteras kommer programmet att krascha.
Låt oss till exempel överväga ett program där vi har en funktion A
som kallar funktion B
, som i sin tur kallar funktion C
. Om ett undantag förekommer i funktion C
men inte hanteras C
, övergår undantaget till B
och sedan till A
.
Om det aldrig hanteras visas ett felmeddelande och vårt program stoppas plötsligt oväntat.
Fångar undantag i Python
I Python kan undantag hanteras med hjälp av ett try
uttalande.
Den kritiska åtgärden som kan leda till ett undantag placeras i try
klausulen. Koden som hanterar undantagen är skriven i except
paragrafen.
Vi kan alltså välja vilka operationer som ska utföras när vi har fått undantaget. Här är ett enkelt exempel.
# 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 är en Oops! inträffade. Nästa post. Inlägget är 0 Oj! inträffade. Nästa post. Inmatningen är 2 Det ömsesidiga av 2 är 0,5
I det här programmet går vi igenom värdena i listan randomList. Som tidigare nämnts placeras den del som kan orsaka ett undantag inuti try
blocket.
Om inget undantag inträffar except
hoppas blocket över och normalt flöde fortsätter (för sista värdet). Men om något undantag inträffar, fångas det av except
blocket (första och andra värden).
Här skriver vi ut namnet på undantaget med exc_info()
funktionen inuti sys
modulen. Vi kan se att a
orsaker ValueError
och 0
orsaker ZeroDivisionError
.
Eftersom varje undantag i Python ärver från basklassen Exception
kan vi också utföra ovanstående uppgift på följande sätt:
# 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)
Detta program har samma utgång som ovanstående program.
Fångar specifika undantag i Python
I exemplet ovan nämnde vi inget specifikt undantag i except
klausulen.
Detta är inte en bra programmeringspraxis eftersom det kommer att fånga alla undantag och hantera alla fall på samma sätt. Vi kan ange vilka undantag en except
klausul ska fånga.
En try
klausul kan ha valfritt antal except
klausuler för att hantera olika undantag, men endast en kommer att köras om ett undantag inträffar.
Vi kan använda en tippel värden för att ange flera undantag i en undantagssats. Här är ett exempel på en pseudokod.
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
Öka undantag i Python
I Python-programmering tas undantag upp när fel uppstår vid körning. Vi kan också manuellt höja undantag med hjälp av raise
nyckelordet.
Vi kan valfritt överföra värden till undantaget för att klargöra varför detta undantag togs upp.
>>> 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 försök med annat klausul
I vissa situationer kanske du vill köra ett visst kodblock om kodblocket inuti try
sprang utan några fel. I dessa fall kan du använda det valfria else
nyckelordet med try
uttalandet.
Obs! Undantag i den andra klausulen hanteras inte av de föregående utom klausulerna.
Låt oss titta på ett exempel:
# 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
Om vi passerar ett udda tal:
Ange ett nummer: 1 Inte ett jämnt nummer!
Om vi passerar ett jämnt tal beräknas och återges det ömsesidiga.
Ange ett nummer: 4 0,25
Men om vi passerar 0 får vi ZeroDivisionError
eftersom kodblocket inuti else
inte hanteras av föregå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()
Denna typ av konstruktion ser till att filen stängs även om ett undantag inträffar under programkörningen.