U ovom ćete uputstvu naučiti kako se nositi s iznimkama u vašem programu Python pomoću naredbi try, osim i konačno uz pomoć primjera.
Video: Rukovanje iznimkama Pythona (pokušajte … osim … konačno)
Iznimke u Pythonu
Python ima mnogo ugrađenih iznimaka koji se pojavljuju kada vaš program naiđe na pogrešku (nešto u programu pođe po zlu).
Kada se pojave ove iznimke, Python interpreter zaustavlja trenutni proces i prosljeđuje ga pozivajućem procesu dok se njime ne rukuje. Ako se ne riješi, program će se srušiti.
Na primjer, razmotrimo program u kojem imamo funkciju A
koja poziva funkciju B
, a ona pak poziva funkciju C
. Ako se iznimka dogodi u funkciji, C
ali se s njom ne postupa C
, iznimka se prosljeđuje na, B
a zatim na A
.
Ako se nikad ne riješi, prikazuje se poruka o pogrešci i naš se program iznenada zaustavlja.
Hvatanje iznimaka u Pythonu
U Pythonu se s iznimkama može postupati pomoću try
naredbe.
Kritična operacija koja može stvoriti iznimku smještena je unutar try
klauzule. Kôd koji obrađuje iznimke napisan je u except
klauzuli.
Tako možemo odabrati koje ćemo operacije izvršiti nakon što uhvatimo iznimku. Evo jednostavnog primjera.
# 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)
Izlaz
Unos je Ups! dogodila. Sljedeći unos. Unos je 0 Ups! dogodio. Sljedeći unos. Unos je 2 Uzajamnost od 2 je 0,5
U ovom programu prolazimo kroz vrijednosti popisa randomList. Kao što je prethodno spomenuto, dio koji može uzrokovati iznimku smješten je unutar try
bloka.
Ako se ne dogodi iznimka, except
blok se preskače i nastavlja se normalni protok (za zadnju vrijednost). Ali ako se dogodi neka iznimka, hvata je except
blok (prva i druga vrijednost).
Ovdje ispisujemo naziv iznimke pomoću exc_info()
funkcije unutar sys
modula. Možemo vidjeti da a
uzroci ValueError
i 0
uzroci ZeroDivisionError
.
Budući da se svaka iznimka u Pythonu nasljeđuje iz osnovne Exception
klase, gornji zadatak možemo izvršiti i na sljedeći način:
# 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)
Ovaj program ima isti izlaz kao i gornji program.
Hvatanje određenih izuzetaka u Pythonu
U gornjem primjeru nismo spomenuli nikakvu posebnu iznimku u except
klauzuli.
Ovo nije dobra programska praksa jer će uhvatiti sve iznimke i rješavati svaki slučaj na isti način. Možemo odrediti koje bi iznimke except
klauzula trebala uhvatiti.
try
Klauzula može imati bilo koji broj except
klauzula da obrađuju različite iznimke, međutim, samo jedan će biti izvršen u slučaju javlja iznimka.
Možemo upotrijebiti skup vrijednosti kako bismo odredili višestruke iznimke u klauzuli osim. Evo primjera pseudo koda.
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
Povećavanje iznimaka u Pythonu
U programiranju na Pythonu izuzeci se pojavljuju kada se pogreške pojave tijekom izvođenja. Također možemo ručno stvoriti iznimke pomoću raise
ključne riječi.
Izborno možemo proslijediti vrijednosti iznimci kako bismo pojasnili zašto je ta iznimka pokrenuta.
>>> 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 pokušajte s klauzulom else
U nekim ćete situacijama možda htjeti pokrenuti određeni blok koda ako se blok koda try
izvodio bez ikakvih pogrešaka. U tim slučajevima možete upotrijebiti neobaveznu else
ključnu riječ s try
iskazom.
Napomena : Iznimke u klauzuli else ne obrađuju prethodne, osim klauzula.
Pogledajmo primjer:
# 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)
Izlaz
Ako prođemo neparan broj:
Unesite broj: 1 Ni paran broj!
Ako prođemo paran broj, recipročna vrijednost se izračunava i prikazuje.
Unesite broj: 4 0,25
Međutim, ako prođemo 0, dobit ćemo ZeroDivisionError
jer blok koda iznutra else
nije obrađen prethodnim 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()
Ova vrsta konstrukcije osigurava zatvaranje datoteke čak i ako se tijekom izvođenja programa dogodi izuzetak.