V tomto tutoriáli sa dozviete, ako pomocou príkladov zvládnuť výnimky vo vašom pythonovskom programe pomocou príkazov try, except a nakoniec.
Video: Spracovanie výnimiek Pythonu (skúste … až na … konečne)
Výnimky v Pythone
Python má veľa zabudovaných výnimiek, ktoré sa vyvolajú, keď váš program narazí na chybu (niečo v programe sa pokazí).
Keď sa vyskytnú tieto výnimky, tlmočník Pythonu zastaví aktuálny proces a odovzdá ho volajúcemu procesu, kým nebude spracovaný. Ak sa program nespracuje, dôjde k jeho zlyhaniu.
Uvažujme napríklad o programe, kde máme funkciu, A
ktorá volá funkciu B
, ktorá zase volá funkciu C
. Ak sa vo funkcii vyskytne výnimka, C
ale nie je spracovaná C
, výnimka prejde do B
a potom do A
.
Pokiaľ sa s ním nikdy nespracuje, zobrazí sa chybové hlásenie a náš program sa náhle neočakávane zastaví.
Chytanie výnimiek v Pythone
V Pythone možno výnimky vybaviť pomocou try
príkazu.
Kritická operácia, ktorá môže vyvolať výnimku, je umiestnená vo vnútri try
doložky. Kód, ktorý spracováva výnimky, je napísaný v except
doložke.
Môžeme si tak zvoliť, aké operácie sa majú vykonať, keď chytíme výnimku. Tu je jednoduchý prí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ýkon
Záznam je Oops! došlo. Ďalší záznam. Záznam je 0 Hops! došlo. Ďalší záznam. Položka je 2. Obojstranný zápis hodnoty 2 je 0,5
V tomto programe prechádzame hodnotami zoznamu randomList. Ako už bolo spomenuté, časť, ktorá môže spôsobiť výnimku, je umiestnená vo vnútri try
bloku.
Ak nenastane žiadna výnimka, except
blok sa preskočí a pokračuje normálny tok (pre poslednú hodnotu). Pokiaľ ale dôjde k akejkoľvek výnimke, zachytí ju except
blok (prvá a druhá hodnota).
Tu vytlačíme názov výnimky pomocou exc_info()
funkcie inside sys
module. Vidíme, že a
príčiny ValueError
a 0
príčiny ZeroDivisionError
.
Pretože každá výnimka v Pythone dedí zo základnej Exception
triedy, môžeme vyššie uvedenú úlohu vykonať aj nasledujúcim spôsobom:
# 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á rovnaký výstup ako vyššie uvedený program.
Chytanie špecifických výnimiek v Pythone
Vo vyššie uvedenom príklade sme v except
doložke neuviedli žiadnu konkrétnu výnimku .
Toto nie je dobrý programovací postup, pretože zachytí všetky výnimky a všetky prípady vyrieši rovnako. Môžeme určiť, ktoré výnimky má except
klauzula zachytiť.
try
Klauzula môže mať ľubovoľný počet except
doložiek spracovávať rôzne výnimky, však, bude vykonaný iba jeden prípad, dôjde k výnimke.
Môžeme použiť n-ticu hodnôt na zadanie viacerých výnimiek v klauzule kromě. Tu je prí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šovanie výnimiek v Pythone
V programovaní v Pythone sú výnimky vyvolané, keď sa vyskytnú chyby za behu. Výnimky môžeme tiež manuálne zvýšiť pomocou raise
kľúčového slova.
Voliteľne môžeme odovzdať hodnoty výnimke, aby sme objasnili, prečo bola táto výnimka vyvolaná.
>>> 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 vyskúšajte klauzulu else
V niektorých situáciách možno budete chcieť spustiť určitý blok kódu, ak sa blok kódu vo vnútri try
spustil bez akýchkoľvek chýb. V týchto prípadoch môžete else
s try
vyhlásením použiť voliteľné kľúčové slovo .
Poznámka : Výnimky v klauzule else nie sú riešené predchádzajúcimi klauzulami okrem.
Pozrime sa na príklad:
# 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)
Výkon
Ak odovzdáme nepárne číslo:
Zadajte číslo: 1 Nie párne číslo!
Ak minieme párne číslo, recipročná hodnota sa spočíta a zobrazí.
Zadajte číslo: 4 0,25
Ak však minieme 0, dostaneme sa, ZeroDivisionError
pretože blok kódu vo vnútri else
nie je spracovaný predchádzajúcim 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 konštrukcie zaisťuje, že je súbor zatvorený, aj keď počas vykonávania programu dôjde k výnimke.