Python


Oh, te napake! (o izjemah)

Zanesljivo si že doživel med delovanjem svojih programov napake. Kot na primer, če želiš odpreti neko datoteko, te pa ni. Ali pa bi program moral kaj deliti z nič, kar v računalništvu ni dopustno. V tem poglavju bomo spoznali, kako naj program take obravnava bolj prizanesljivo, ne pa da se drastično zaključi. 

Take napake imenujemo v Pythonu izjeme (exceptions), saj predstavljajo izjeme glede na običajno obnašanje programa. Ko pride do napake, sproži  Python  izjemo, ki normalno pomeni, da naš program "umre". Lahko pa naredimo, da tak izjemen dogodek obravnavamo tako, kot to mi hočemo. Kako to storimo?

Napiši naslednji program:

    imeDatoteke = raw_input( "Podaj ime datoteke: " )
datoteka = open( imeDatoteke )
print datoteka.read()
print "To je vse."

Sedaj poženi program. Vpiši ime datoteke, ki ne obstaja Python se bo odzval z obvestilom o napako, morda tako:

    Traceback (innermost last):
File "filetest.py", line 1, in ?
IOError: (2, 'No such file or directory')

V zadnji vrstici nam sporoča, da je ugotovil vhodno-izhodno napako ("IOError") in, ker ne ve kako nadaljevati, prekinja program. No, lahko sestavimo svoj program, ki bo "ulovil" to napako. Pythonu v tem primeru ni treba skrbeti zanjo. To naredimo tako:

    imeDatoteke = raw_input( "Podaj ime datoteke: " )
try:
datoteka = open( imeDatoteke )
print datoteka.read()
except IOError:
print "Imenovane datoteke ni", filename
print "To je vse."

Preskusi ta program. Če mu vtipkaš nesmiselno ime datoteke, bo Python izpisal obvestilo "Imenovane datoteke ni" in ne bo takoj prekinil programa. To se zgodi, ker  v primeru, če uporabimo stavek try, Python poskuša izvesti stavke v bloku stavkov za besedico "try". Če pri tem ne pride do napake, preskoči Python  blok stavkov, ki sledi besedici "except".  Če pa bi prišlo do napake, Python preskoči preostale stavke v bloku stavkov. (V našem primeru, če stavek "open" povzroči napako, preskoči stavek "print". ) V primeru napake Python nato še pogleda, ali se napaka ujema z napako, navedeno v stavku except (V našem primeru z napako IOError).  Če ugotovi, da je to ta napaka, izvede blok stavkov, ki sledi stavku "except".  Sicer (če je napaka kakšna druga) reagira nanjo na običajen način (prekine program).

Stavke  "try...except" lahko gnezdimo drugega v drugem in tako lovimo različne vrste napak. Na primer:

    izvajaj = 1
while izvajaj:
try:
print "1) Prikazi sort.py"
print "2) Prikazi osebe.py"
print "3) Konec"
izbira = input()
if izbira == 1:
try:
print open("sort.py").read()
except IOError:
print "datoteke sort.py ne morem odpreti"
elif izbira == 2:
try:
print open("osebe.py").read()
except IOError:
print "Datoteke osebe.py ne morem odpreti"
elif izbira == 3:
izvajaj = 0
else:
print "Slabo si izbral"
except NameError:
print "Tvoj vnos je bil napacen"

Sedaj lahko svoje programe, ki si jih doslej sestavil, ustrezno poboljšaš. Poženi programe in namerno vtipkaj napačne podatke. Opazuj, kaj se zgodi (kakšen izpis dobiš) in primerno dopolni programe. 

Lahko pa pogledaš "Library Reference" in pri funkcijah oziroma modulih, ki jih uporabljaš, ugotoviš, kakšne izjeme sprožajo.