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.