V tomto kurzu se naučíte, jak zacházet s výjimkami v programu Python pomocí příkazů try, except a nakonec pomocí příkladů.
Video: Zpracování výjimek Pythonu (zkuste … až na … konečně)
Výjimky v Pythonu
Python má mnoho vestavěných výjimek, které jsou vyvolány, když váš program narazí na chybu (něco v programu se pokazí).
Když dojde k těmto výjimkám, překladač Pythonu zastaví aktuální proces a předá jej volajícímu procesu, dokud nebude zpracován. Pokud nebude zpracován, program se zhroutí.
Uvažujme například o programu, kde máme funkci, A
která volá funkci B
, která zase volá funkci C
. Pokud dojde k výjimce ve funkci, C
ale není zpracována C
, výjimka předá B
a potom A
.
Pokud nebude nikdy zpracováno, zobrazí se chybová zpráva a náš program se náhle nečekaně zastaví.
Chytání výjimek v Pythonu
V Pythonu lze výjimky zpracovat pomocí try
příkazu.
Kritická operace, která může vyvolat výjimku, je umístěna uvnitř try
klauzule. Kód, který zpracovává výjimky, je zapsán v except
klauzuli.
Můžeme si tedy vybrat, jaké operace provést, jakmile zachytíme výjimku. Zde je jednoduchý příklad.
# 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)
Výstup
Záznam je Jejda! došlo. Další záznam. Záznam je 0 Jejda! došlo. Další záznam. Položka je 2 Převrácená hodnota 2 je 0,5
V tomto programu procházíme hodnotami seznamu randomList. Jak již bylo zmíněno dříve, část, která může způsobit výjimku, je umístěna uvnitř try
bloku.
Pokud nedojde k žádné výjimce, except
blok se přeskočí a pokračuje normální tok (pro poslední hodnotu). Pokud ale dojde k nějaké výjimce, je chycena except
blokem (první a druhá hodnota).
Zde vytiskneme název výjimky pomocí exc_info()
funkce uvnitř sys
modulu. Vidíme, že a
příčiny ValueError
a 0
příčiny ZeroDivisionError
.
Protože každá výjimka v Pythonu dědí ze základní Exception
třídy, můžeme výše uvedený úkol provést také následujícím způsobem:
# 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)
Tento program má stejný výstup jako výše uvedený program.
Chytání konkrétních výjimek v Pythonu
Ve výše uvedeném příkladu jsme v except
klauzuli nezmínili žádnou konkrétní výjimku .
To není dobrý programovací postup, protože zachytí všechny výjimky a zvládne všechny případy stejným způsobem. Můžeme určit, které výjimky except
by měla klauzule zachytit.
try
Klauzule může mít libovolný počet except
doložek zpracovávat různé výjimky, nicméně, bude proveden pouze jeden případ, dojde k výjimce.
Můžeme použít n-tici hodnot k určení více výjimek v klauzuli kromě. Zde je příklad pseudokódu.
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
Zvyšování výjimek v Pythonu
V programování v Pythonu jsou výjimky vyvolány, když dojde k chybám za běhu. Můžeme také ručně vyvolat výjimky pomocí raise
klíčového slova.
We can optionally pass values to the exception to clarify why that exception was raised.
>>> 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 try with else clause
In some situations, you might want to run a certain block of code if the code block inside try
ran without any errors. For these cases, you can use the optional else
keyword with the try
statement.
Note: Exceptions in the else clause are not handled by the preceding except clauses.
Let's look at an example:
# 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)
Output
If we pass an odd number:
Enter a number: 1 Not an even number!
If we pass an even number, the reciprocal is computed and displayed.
Enter a number: 4 0.25
However, if we pass 0, we get ZeroDivisionError
as the code block inside else
is not handled by preceding 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()
Tento typ konstrukce zajišťuje, že je soubor uzavřen, i když během provádění programu dojde k výjimce.