Zpracování výjimek Pythonu Pomocí příkazu try, except a nakonec

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, Akterá volá funkci B, která zase volá funkci C. Pokud dojde k výjimce ve funkci, Cale není zpracována C, výjimka předá Ba 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í trypříkazu.

Kritická operace, která může vyvolat výjimku, je umístěna uvnitř tryklauzule. Kód, který zpracovává výjimky, je zapsán v exceptklauzuli.

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ř trybloku.

Pokud nedojde k žádné výjimce, exceptblok se přeskočí a pokračuje normální tok (pro poslední hodnotu). Pokud ale dojde k nějaké výjimce, je chycena exceptblokem (první a druhá hodnota).

Zde vytiskneme název výjimky pomocí exc_info()funkce uvnitř sysmodulu. Vidíme, že apříčiny ValueErrora 0příčiny ZeroDivisionError.

Protože každá výjimka v Pythonu dědí ze základní Exceptiontří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 exceptklauzuli 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 exceptby měla klauzule zachytit.

tryKlauzule může mít libovolný počet exceptdolož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í raiseklíč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.

Zajímavé články...