Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

Programiranje 1

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

ETF Beograd::Programiranje 1 27/27

You might also like