140 likes | 246 Views
Python. Napake in izjeme. Zgled. a = int(input("Kaj delimo: ")) b = int(input("S čim: ")) rez = a / b print(a, '/', b, '=', rez). >>> Kaj delimo: 3 S čim: 4 3 / 4 = 0.75 >>>. >>> Kaj delimo: 3 S čim: 0 Traceback (most recent call last):
E N D
Python Napake in izjeme
Zgled • a = int(input("Kaj delimo: ")) • b = int(input("S čim: ")) • rez = a / b • print(a, '/', b, '=', rez) >>> Kaj delimo: 3 S čim: 4 3 / 4 = 0.75 >>> >>> Kaj delimo: 3 S čim: 0 Traceback (most recentcall last): File "E:/PrJ/OOP/primerNap.py", line 3, in <module> rez = a / b ZeroDivisionError: intdivision or modulobyzero >>>
Varovalna mreža • try ... except a = int(input("Kaj delimo: ")) b = int(input("S čim: ")) try : rez = a / b print(a, '/', b, '=', rez) except : print('NAPAKA: Deljenje z 0 ni možno') print('Nadaljevanje programa') >>> Kaj delimo: 3 S čim: 0 NAPAKA: Deljenje z 0 ni možno Nadaljevanje programa >>> >>> Kaj delimo: 3 S čim: 4 3 / 4 = 0.75 Nadaljevanje programa
Try ... except • try : • Poskusi izvesti stavke znotraj tega bloka • Če je vse ok, nadaljuj za try/except • except: • Če pride do napake, nadaljuj tukaj • Običajno nadaljevanje
Seveda gre tudi s stavkom if • Kaj pa >>> Kaj delimo: 2 S čim: 2abla Traceback (most recentcall last): File "E:/PrJ/OOP/primerNap.py", line 2, in <module> b = int(input("S čim: ")) ValueError: invalid literalforint() with base 10: '2abla' >>> • Napaka pri vnosu! Ni v varovalni mreži!
Varovalna mreža II try : a = int(input("Kaj delimo: ")) b = int(input("S čim: ")) rez = a / b print(a, '/', b, '=', rez) except : print('NAPAKA: Deljenje z 0 ni možno') print('Nadaljevanje programa') >>> Kaj delimo: 3 S čim: 2a NAPAKA: Deljenje z 0 ni možno Nadaljevanje programa >>> >>> Kaj delimo: 3 S čim: 4 3 / 4 = 0.75 Nadaljevanje programa
Varovalna mreža III try : a = int(input("Kaj delimo: ")) except : print('To ni število! Vzel bom kar 1') a = 1 ok = False while not ok : try : b = int(input("S čim: ")) ok = True except print('To ni število! Vnesi ponovno') # imamo tako a, kot b try : rez = a / b print(a, '/', b, '=', rez) except : print('NAPAKA: Deljenje z 0 ni možno') print('Nadaljevanje programa') >>> Kaj delimo: 3 S čim: a To ni število! Vnesi ponovno S čim: 0 NAPAKA: Deljenje z 0 ni možno Nadaljevanje programa >>> >>> Kaj delimo: q To ni število! Vzel bom kar 1 S čim: 12 1 / 12 = 0.0833333333333 Nadaljevanje programa >>>
Kaj je še možno • Lahko lovimo le določene izjeme • Lahko predvidimo več varovalnih mrež • try: • ... • except Opis_napake1 : • Kaj ob napaki 1 • except Opis_napake2 : • Kaj ob napaki 2 • except Opis_napake3 : • Kaj ob napaki 3 • In še marsikaj
Javljanje napak • Napake lahko javimo/sprožimo tudi mi • raiseException('Opis napake') • Npr.: • Želimo ustvariti zajca z negativno začetno težo • Zajcu nekdo poskusi nastaviti težo izven dovoljenih meja • Zajec se je preveč zredil • Nekdo želi -7. Fibonaccijevo število • Bolje, kot če le s print opozorimo na napako! • Možnost prestreči javljeno napako in ustrezno ukrepati
Napaka ob "stvaritvi" def __init__(self, sp, teža, ser) : self.spol = sp if teža <= 0 : raise Exception('ne morem ustvariti zajca s težo ' + str(teža)) if teža > 10 : raise Exception(Zajec je pretežak: ' + str(teža)) # če smo tu, je teža med 0 in 10 self.masa = teža self.serijska = ser
Zgled >>> rj = Zajec(True, 2, 'S1') >>> be = Zajec(True, -2, 'S1') Traceback (most recentcall last): File "<pyshell#2>", line 1, in <module> be = Zajec(True, -2, 'S1') File "E:\PrJ\OOP\Zajec.py", line 6, in __init__ raiseException('ne morem ustvariti zajca s težo ' + str(teža)) Exception: ne morem ustvariti zajca s težo -2 >>> čr = Zajec(True, 12, 'S1') Traceback (most recentcall last): File "<pyshell#3>", line 1, in <module> čr = Zajec(True, 12, 'S1') File "E:\PrJ\OOP\Zajec.py", line 8, in __init__ raiseException('Zajec je pretežak: ' + str(teža)) Exception: Zajec je pretežak: 12 >>>
Seveda lahko lovimo tudi te izjeme try : čr = Zajec(False, 12, 'S2') except : print('Takega zajca ni, zato sem naredil samca s težo 1 in ser. št."NN"') čr = Zajec(True, 1, 'NN') Takega zajca ni, zato sem naredil samca s težo 1 in ser. št."NN" >>>
vrniNto(self, n) def vrniNto(self, n) : if n < 0 : raise Exception(str(n)+ '.to Fib. Število ne obstaja!') if n <= 20 : return self._tabela[n] return self.vrniNto(n - 2) + self.vrniNto(n - 1)
spremeniTežo defspremeniTezo(self, novaTeza) : # smislena nova teza je le med 0 in 10 kg if 0 < novaTeza <= 10 : self.masa = novaTeza else : raiseException('Tako težkega zajca ni')