Obrada grešaka na programskom jeziku Python Univerzitet u Beogradu Elektrotehnički fakultet 2020/2021. Moto
“Special cases aren't special
enough to break the rules”
The Zen of Python
ETF Beograd::Programiranje 1 2/27
Uvod (1) Ukoliko dođe do greške pri izvršavanju programa, on se trenutno prekida ⚫ Ispisuje se poruka o grešci koja je nastala ⚫ Interpreter prestaje sa radom Primer – greška prilikom konverzije tipa >>> str = input() 3.14 >>> a = int(str) Traceback (most recent call last): File "<pyshell#126>", line 1, in <module> a = int(str) + 7 ValueError: invalid literal for int() with base 10: '3.14’
ETF Beograd::Programiranje 1 3/27
Uvod (2) Primer – prekoračenje opsega stringa >>> poruka = "Hello" >>> poruka[10] Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> poruka[10] IndexError: string index out of range Primer – deljenje sa nulom >>> 100/0 Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> 100/0 ZeroDivisionError: division by zero ETF Beograd::Programiranje 1 4/27 Uvod (3) Primer – datoteka nije pronađena >>> f = open('datoteka.txt') Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> f = open('datoteka.txt') FileNotFoundError: [Errno 2] No such file or directory: 'datoteka.txt’ Da li je moguće zaobići prekidanje programa i oporaviti se od greške?
ETF Beograd::Programiranje 1 5/27
Greške na programskom jeziku Python Python prepoznaje dva tipa grešaka: ⚫ Sintaksne greške i izuzetke Sintaksna greška nastaje usled neispravno napisane jezičke konstrukcije: >>> while True print('Hello world') File "<stdin>", line 1 while True print('Hello world') ^ SyntaxError: invalid syntax ⚫ Nedostaje : pre poziva funkcije print() ⚫ Obično se ispisuje broj linije u kojoj se dogodila greška ⚫ Rešenje – popraviti sintaksnu grešku
ETF Beograd::Programiranje 1 6/27
Definicija izuzetka (1) Izuzetak (exception) je situacija koja se dogodi tokom izvršavanja programa, a remeti normalan tok njegovog izvršavanja ⚫ Kada Python interpreter naiđe na situaciju s kojom ne može da se izbori, on generiše (baca, podiže) izuzetak ⚫ U užem smislu, izuzezak je Python objekat koji predstavlja grešku koja se dogodila Kada deo koda generiše izuzetak, on mora ili da se odmah obradi ili se kod nasilno prekida i izvršavanje se završava
ETF Beograd::Programiranje 1 7/27
Definicija izuzetka (2) Većina izuzetaka ne bude obrađena od strane programa To rezultuje prekidanjem programa i ispisom odgovarajuće poruke ⚫ Sadrži tip (ime) izuzetka ⚫ Razlog zbog koga je greška nastala ⚫ Kontekst u kome se greška desila Mesto (liniju) u kojoj se greška desila u kodu Postoji veliki broj standardnih, ugrađenih izuzetaka ⚫ Standard (built-in) exceptions ETF Beograd::Programiranje 1 8/27 Neki standardni izuzeci (1) Ime izuzetka Opis NameError Baca se kada identifikator ne može da se pronađe u lokalnom ili globalnom prostoru imena. IndexError Baca se kada se nekorektan indeks (indeks van opsega) upotrebi za pristup sekvenci. TypeError Bace se kada se pokuša upotreba operatora ili funkcije koja je nevalidna za specificirani tip. ValueError Bace se kada ugrađena funkcija za tip podataka ima validne argumente sa nevalidnim vrednostima. IOError Baca se kada ulazno-izlazna operacija ne uspe, kao što je otvaranje datoteke koja ne postoji. FileNotFoundError Baca se kada datoteka ili direktorijum koji su zahtevani ne postoje.
ETF Beograd::Programiranje 1 9/27
Neki standardni izuzeci (2) Ime izuzetka Opis EOFError Baca se kada input() function ne pročita nikakav sadržaj, a dostigne se kraj datoteke. ZeroDivisonError Baca se kada se dogodi deljenje s nulom kod svih numeričkih tipova. OverflowError Baca se kada rezultat izračunavanja prekorači maksimalni opseg odgovarajućeg numeričkog tipa. FloatingPointError Baca se kada ne uspe izračunavanje izraza korišćenjem realne aritmetike. ImportError Baca se kada ne uspe uvoz modula. AssertionError Baca se kada nije ispunjen uslov assert naredbe.
ETF Beograd::Programiranje 1 10/27
Obrada izuzetaka (1) Izuzeci se obrađuju (hvataju) korišćenjem try-except blokova ⚫ Problematičan kod se smešta u okviru try bloka ⚫ Kod koji obrađuje izuzetak i rešava problem se smešta u okviru except bloka Generalna sintaksa: try: #Blok koda koji se izvršava except Izuzetak1: #Ako se desi Izuzetak 1, izvršava se ovaj blok .......... except IzuzetakX, IzuzetakY: #Ako se desi Izuzetak X ili Izuzetak Y, #izvršava se ovaj blok else: #Ako se ne desi nijedan izuzetak, #izvršava se ovaj blok
ETF Beograd::Programiranje 1 11/27
Obrada izuzetaka (2) Jednu try naredbu može pratiti više imenovanih except blokova ⚫ U tom slučaju, svaki blok obrađuje odgovarajući tip izuzetka ili više njih (odvojenih zarezom) ⚫ Korisno ukoliko blok može da generiše više tipova izuzetaka U okviru try bloka se može navesti i samo jedan, generički except blok ⚫ U okviru njega se onda obrađuju svi tipovi izuzetaka ⚫ Ne smatra se dobrom programerskom praksom Nakon except blokva, može se navesti opcioni else blok ⚫ Kod u okviru else bloka se izvršava samo ukoliko kod u okviru try bloka ne generiše izuzetak
ETF Beograd::Programiranje 1 12/27
Obrada izuzetaka (3) Primer – otvaranje datoteke koja postoji za upis ⚫ Obratiti pažnju na režim otvaranja za upis "x" koji generiše izuzetak ukoliko datoteka već postoji try: fh = open("testdat.txt", "x") fh.write("Ovo je test rada sa izuzecima!!") except IOError: print ("Ne mogu da pronadjem datoteku ili procitam ili pisem u datoteku!") else: print ("Sadrzaj uspesno upisan") fh.close()
ETF Beograd::Programiranje 1 13/27
Obrada izuzetaka (4) Jedan try-except blok može pratiti finally blok ⚫ Blok finally se izvršava bez obzira da li je kod generisao izuzetak ili ne ⚫ Ukoliko je izuzetak generisan, a nije obrađen, on se ponovo podiže nakon izvršavanja finally bloka. Sintaksa: try: #Deo koda koji se izvršava ...................... #Zbog izuzetka izvršavanje dela koda #se može prekočiti finally: #Deo koda koji se uvek izvršava
ETF Beograd::Programiranje 1 14/27
Obrada izuzetaka (5)
ETF Beograd::Programiranje 1 15/27
Ugneždavanje izuzetaka (1) Blokovi za obradu izuzetaka se mogu ugneždavati Kada se desi izuzetak u okviru try bloka, pokušava se pronalaženje odgovarajućeg except bloka ⚫ Ukoliko takav postoji, on se izvršava i nastavlja se izvršavanje koda nakon try bloka ⚫ Ukoliko takav ne postoji, izuzetak se šalje spoljašnjem try bloku, ukoliko postoji Ukoliko se izuzetak ne obradi, program prekida izvršavanje ETF Beograd::Programiranje 1 16/27 Ugneždavanje izuzetaka (2) Primer try: fh = open("testdat.txt", "x") try: fh.write("Ovo je test rada sa izuzecima!!") finally: print ("Zatvaram datoteku.") fh.close() except IOError: print ("Ne mogu da pronadjem datoteku ili procitam ili pisem u datoteku!")
ETF Beograd::Programiranje 1 17/27
Ugneždavanje izuzetaka (3) Primer spoljni try blok x = 10 ugnjezdeni try blok spoljni except blok y = 0 division by zero try: print("spoljni try blok") try: print("ugnjezdeni try blok") print(x / y) except TypeError as te: print(" ugnjezdeni except blok") print(te) except ZeroDivisionError as ze: print("spoljni except blok") print(ze) ETF Beograd::Programiranje 1 18/27 Argument izuzetka (1) Objekat izuzetka može imati argument koji sadrži više informacija o tome što se dogodilo ⚫ Dobija se u formi torke koja obično sadrži opis greške, broj greške i njenu lokaciju ⚫ Često sadrži i objekat ili vrednost koja je izazvala grešku try: #Deo koda koji se izvršava ...................... except ExceptionType as Argument: #Deo koda koji obrađuje izuzetak ili ispisuje grešku
ETF Beograd::Programiranje 1 19/27
Argument izuzetka (2) Primer – konverzija broja def konvertuj(var): try: return int(var) except ValueError as Arg: print ("Argument funkcije nije broj\n", Arg) konvertuj("abc") Izlaz: Argument funkcije nije broj invalid literal for int() with base 10: 'abc'
ETF Beograd::Programiranje 1 20/27
Generisanje izuzetka (1) Izuzeci se mogu generisati korišćenjem naredbe: raise imeIzuzetka Argument imeIzuzetka mora biti objekat izuzetka ⚫ Može se koristiti neki od ugrađenih, standardnih izuzetaka ⚫ Mogu se napraviti korisnički definisani izuzeci Korišćenjem gotovog tipa Exception ⚫ Može se parametrizovati porukom ili objektom koji je izazvao problem
ETF Beograd::Programiranje 1 21/27
Generisanje izuzetka (2) Primer – korenovanje negativnog broja import math def korenovanje( broj ): if broj <0: raise Exception("Negativan broj!", broj) return math.sqrt(broj) try: k = korenovanje(-10) print ("koren = ",k) except Exception as e: print ("Problem sa argumentom", e) Izlaz: Problem sa argumentom ('Negativan broj!', -10)
ETF Beograd::Programiranje 1 22/27
Asertacije (1) Asertacije predstavljaju način za testiranje programa na nepredviđene ulaze ⚫ Nekorektni ili nemogući ulazi ili rezultati izraza ⚫ Ako izraz koji se evaluira nije korektan, generiše se AssertionError Sintaksa: assert Expression[, Arguments] Po potrebi se može isključiti, nakon testiranja
ETF Beograd::Programiranje 1 23/27
Asertacije (2) Primer – konverzija temperature ⚫ Iz Kelvina u Farenhajte def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),\ "Hladnije od apsolutne nule!" return ((Temperature-273)*1.8)+32 print (KelvinToFahrenheit(273)) print (int(KelvinToFahrenheit(505.78))) print (KelvinToFahrenheit(-5))
ETF Beograd::Programiranje 1 24/27
Asertacije (3) Izlaz: 32.0 451 Traceback (most recent call last): File "asertacije.py", line 14, in <module> print (KelvinToFahrenheit(-5)) File "asertacije.py", line 9, in KelvinToFahrenheit assert (Temperature >= 0),"Hladnije od apsolutne nule!" AssertionError: Hladnije od apsolutne nule! Program je generisao izuzetak za poslednji slučaj, jer se desila nekorektna situacija na ulazu ETF Beograd::Programiranje 1 25/27 Literatura - knjige M. Kovačević, Osnove programiranja u Pajtonu, Akademska misao, Beograd, 2017. M. Lutz, Learning python: Powerful object-oriented programming, 5th edition, O'Reilly Media, Inc., 2013. J. Zelle, Python Programming: An Introduction to Computer Science, 3rd Ed., Franklin, Beedle & Associates, 2016. D. Beazley, B. K. Jones, Python Cookbook, 3rd edition, O'Reilly Media, 2013. A. Downey, J. Elkner, C. Meyers, How To Think Like A Computer Scientist: Learning With Python, free e-book
ETF Beograd::Programiranje 1 26/27
Literatura – online izvori Python 3.8.0 documentation, https://docs.python.org/3/index.html Colin Morris, 7-day Python course, https://www.kaggle.com/learn/python Learn Python, Basic tutorial, https://www.learnpython.org/ TutorialsPoint, Python tutorial https://www.tutorialspoint.com/python/index.ht m