Rukovanje iznimkama Pythona Koristeći naredbu try, osim i konačno

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 Akoja poziva funkciju B, a ona pak poziva funkciju C. Ako se iznimka dogodi u funkciji, Cali se s njom ne postupa C, iznimka se prosljeđuje na, Ba 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 trynaredbe.

Kritična operacija koja može stvoriti iznimku smještena je unutar tryklauzule. Kôd koji obrađuje iznimke napisan je u exceptklauzuli.

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 trybloka.

Ako se ne dogodi iznimka, exceptblok se preskače i nastavlja se normalni protok (za zadnju vrijednost). Ali ako se dogodi neka iznimka, hvata je exceptblok (prva i druga vrijednost).

Ovdje ispisujemo naziv iznimke pomoću exc_info()funkcije unutar sysmodula. Možemo vidjeti da auzroci ValueErrori 0uzroci ZeroDivisionError.

Budući da se svaka iznimka u Pythonu nasljeđuje iz osnovne Exceptionklase, 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 exceptklauzuli.

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 exceptklauzula trebala uhvatiti.

tryKlauzula može imati bilo koji broj exceptklauzula 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 raiseključ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 tryizvodio bez ikakvih pogrešaka. U tim slučajevima možete upotrijebiti neobaveznu elseključnu riječ s tryiskazom.

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 ZeroDivisionErrorjer blok koda iznutra elsenije 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.

Zanimljivi članci...