Korišćenje komande try u kombinaciji sa komandom finally

15.5 Korišćenje komande Try u kombinaciji sa komandom Finally 

U ovom delu upoznavanja sa greškama krećemo od pretpostavke da želimo da učitamo neku datoteku u naš program (ista analogija je za bilo koji fajl objekat koji se može upotrebljavati). Ako nigde pre toga nismo kreirali tu datoteku, kako mi možemo da budemo sigurni da ona postoji ili, ukoliko postoji, kako da se osiguramo da će taj fajl objekat biti pravilno zatvoren ukoliko se u radu pojavila neka greška? Odgovor je – lako. Mi možemo da definišemo potrebne naredbe u bloku koji ide ispod komande finally. Imaj na umu da se može koristiti i naredba except, kako bi hvatala neke druge greške, zajedno sa naredbom finally.
U našem primeru, mi ćemo pokušati da radimo naše uobičajeno izčitavanje datoteke, ali ćemo to raditi sa pauzama od 2 sekunde, koje se javljaju posle prikaza svake linije iz fajla. To postižemo koristeći time.sleep() funkciju, kako bi se naš program pokretao sporije. Kada pokrenete skriptu, u toku njenog izvršavanja, pritisnite ctrl-c da prekinete izvršavanje programa – što ima za cilj da mi sami simuliramo nepredviđene situacije.
Sačuvajte skriptu kao zatvori.py
#!/usr/bin/env python3 

'''Skripta koja pokazuje rad sa komandom finally.'''

import time

# Ukoliko fajl ne postoji
f = None
try:
f = open('Vesela pesma.txt')
while True:
linija = f.readline()
if len(linija) == 0:
break
print(linija, end = '')
time.sleep(2)
except FileNotFoundError:
print('Ne mogu da nađem fajl Vesela pesma.txt')
except KeyboardInterrupt:
print('Prekinuo si čitanje pesme!')
finally:
if f:
f.close()
print('Zatvaramo fajl, kraj programa...')

U ovom primeru, ja sam se osigurao da mi funkcija open() ne kreira fajl sa datim imenom u trenutnom folderu, pomoću komande f = None (do sada znaš da open() ukoliko ne nađe fajl sa prosleđenim imenom, kreira takav fajl u tekućem folderu). Sa ovakvom konstrukcijom, ukoliko ne nađe naš fajl f, Python će izbaciti grešku FileNotFoundError, pa smo je mi „ukečali“ sa odgovarajućim blokom naredbi.
Ali, da vidimo kako skripta radi....
./zatvori.py 
Ne mogu da nađem fajl Vesela pesma.txt
Zatvaramo fajl, kraj programa...

U trenutnom direktorijumu nema dotičnog fajla... Dobro je... A sada da taj fajl prebacimo u ovaj folder (koristimo fajl koji smo kreirali u 12-tom poglavlju ovog tutorijala):
./zatvori.py 
Kada svetlost obiđe
u tvom malom oku
svoj poslednji krug
iznad nezahvalne zemlje.
^CPrekinuo si čitanje pesme!
Zatvaramo fajl, kraj programa...

Prekinuo sam čitanje pesme, i vidim da se izvršio blok definisan ispod KeyboardInterrupt „hvatača greške“ i program se završava. Međutim, pre nego  što je Python izašao iz programa, pokrenuo je i finally blok naredbi pa se i objekat datoteke zatvorio. Komanda finally je zaista korisna, ukoliko želimo da izbegnemo greške prilikom rada sa fajlovima.

15.4 Podizanje sopstvenih
grešaka
Indeks15.6 Naredba with

Коментари