"Hvatanje grešaka"

15.3 „Hvatanje grešaka“

Problem: Dobro, do sada sam ćutao, ali sada već pištim na uši. Zašto mi ti sve ovo govoriš? Greške – pa čini mi se da sam ih video dovoljno do sada, zar ne? U čemu je poenta?
Odgovor: Na ovom mestu sam hteo da ti kažem poentu svega ovoga! Poenta je da postoje greške koje ti možeš napraviti, ili neke na koje ne možeš da utičeš, ili za koje nisi siguran da će se pojaviti. Ako ili kada se greška pojavi, pred tobom se nalaze dve solucije – da se uhvatiš za kosu i, vrišteći, da je čupaš iz sve snage, ili možeš sada da naučiš kako da rukuješ sa njima – da izbaciš neko obaveštenje korisniku, ili da predefinišeš program da radi na neki drugi način kako ne bi bilo posledica po rad nekog korisnika.
Ti možeš da kontrolišeš exceptions pomoću komandi try i except. Suštinski to je jedna komanda - mi jednostavno stavljamo deo našeg programa, za koji sumnjamo da će biti problematičan i izazvati neku grešku, kao blok ispod naredbe try, a komande koje želimo da se izvrše ukoliko se pojavi greška kreiramo kao blok ispod komande except. U suštini, ovo znači da mi okružimo problematični deo programa sa komandama try i except:
try:
    problematičan_deo_programa
except:
    šta_program_radi_ukoliko_se_desi_greška
Ako mi na ovaj način napišemo naš program, tj ukoliko nenavedemo neka imena mogućih grešaka, except blok će kontrolisati program prilikom pojave svih grešaka koje se pojave prilikom izvršavanja try bloka narebi.
Logika nam nalaže da mora postojati barem jedan except blok naredbi ispod try bloka. Inače, u čemu bi bila poenta korišćenja komande try? Ova logika nam daje i dublje razmišljanje – mi za jedan try blok možemo dsa definišemo više except blokova. U ovom trenutku se sigurno pitaš šta će nam više ovih blokova? Zato što mi prilikom definisanja jedne except komande možemo da kažemo Pythonu na koju grešku da obrati pažnju. Evo primer:
>>> try: 
... s = input('Unesi nešto: ')
... print(s)
... except EOFError:
... print('Pritisnuo si kombinaciju ctrl + d! Kraj!')
...
Unesi nešto: Pritisnuo si kombinaciju ctrl + d! Kraj!
>>>

Ako se pojavee greške koje nismo naveli u except komandi, onda će te greške Python da odradi na njegov uobičajni način tj on će da zaustavi izvršavanje programa, pri ćemu će da prikaže poruku o greški koja ga je „strefila“:
>>> try: 
... s = input('Unesi nešto: ')
... print(s)
... except EOFError:
... print('Pritisnuo si kombinaciju ctrl + d! Kraj!')
...
Unesi nešto: Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
>>>

U trenu kada je trebalo da unesem nešto, ja sam pritisnuo kombinaciju tastera ctrl + c, što je prečica na tastaturi koja nasilno prekida izvršavanje programa/komande. Mi je ni na koji način nismo definisali šta se dešava u tom slučaju, pa je Python uradio svoj posao. Ali, ovaj izveštaj o greški nam nije nimalo odmogao, čak šta više – sada imamo ime greške koju treba da hvatamo:
>>> try: 
... s = input('Unesi nešto: ')
... print(s)
... except EOFError:
... print('Pritisnuo si kombinaciju ctrl + d! Kraj!')
... except KeyboardInterrupt:
... print('Huh? Ja nastavljam da radim...')
...
Unesi nešto: Huh? Ja nastavljam da radim...
>>>

Vidimo da možemo da imamo više except blokova od kojih svaka može da definiše situacije pri pojavi jedne određene greške, ali možemo definisati i neku malo veću listu grešaka (što ću ti pokazati za tren, ima samo još jedna stvar koju treba da znaš). Mi možemo da kreiramo i else blok, koji bi bio povezan sa komandama try i except. Komanda else će se izvršiti ako (i samo ako!) se u bloku ispod try komande nije desila niti jedna greška:
>>> try: 
... s = input('Unesi nešto: ')
... print(s)
... except (KeyboardInterrupt, EOFError):
... print('Huh? Ja nastavljam da radim...')
... else:
... print('Uspešno smo prebrodili krizu.')
...
Unesi nešto: Kriza
Kriza
Uspešno smo prebrodili krizu.
>>>

Vidimo da se hvatanje više vrsta grešaka sa jednim except blokom naredbi definiše tako što navodimo sva imena grešaka u zagradi iza komande except.
Takođe, zapamti da se else blok naredbi izvršava samo u slučaju kada nije bilo greške. Da se greška pojavila, izvršio bi se except blok naredbi (ili bi Python prekinuo izvršavanje programa, ukoliko nismo „uhvatili“ konkretan tip greške), pa Pythona ni ne zanima da li postoji ovaj else blok.
U sledećem primeru ću ti pokazati kako da definišeš neku svoju grešku, i kako da je "uhvatiš" prilikom rada programa.

15.2 ExceptionsIndeks15.4 Podizanje
sopstvenih grešaka

Коментари