programiranje 1 uvod u programski jezik...
TRANSCRIPT
Programiranje 1
Obrada grešakana programskom jeziku Python
Univerzitet u Beogradu
Elektrotehnički fakultet
2019/2020.
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’
2/24ETF Beograd::Programiranje 1
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
3/24ETF Beograd::Programiranje 1
Uvod (2)
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?
4/24ETF Beograd::Programiranje 1
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
5/24ETF Beograd::Programiranje 1
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
6/24ETF Beograd::Programiranje 1
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
7/24ETF Beograd::Programiranje 1
Neki standardni izuzeci (1)
8/24ETF Beograd::Programiranje 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.
Neki standardni izuzeci (2)
9/24ETF Beograd::Programiranje 1
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.
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 IzuzetakN:
#Ako se desi Izuzetak N, izvršava se ovaj blok
else:
#Ako se ne desi nijedan izuzetak, #izvršava se ovaj blok
10/24ETF Beograd::Programiranje 1
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⚫ 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
11/24ETF Beograd::Programiranje 1
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()
12/24ETF Beograd::Programiranje 1
Obrada izuzetaka (4)
Umesto except blokova, try blok može pratiti finally blok⚫ Blok se izvršava bez obzira da li je kod generisao izuzetak ili ne⚫ Isključuje upotrebu except bloka
⚫ Ukoliko je izuzetak generisan, 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
13/24ETF Beograd::Programiranje 1
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
14/24ETF Beograd::Programiranje 1
Ugneždavanje izuzetaka (2)
Primertry:
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!")
15/24ETF Beograd::Programiranje 1
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
16/24ETF Beograd::Programiranje 1
Argument izuzetka (2)
Primer – konverzija brojadef 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'
17/24ETF Beograd::Programiranje 1
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
18/24ETF Beograd::Programiranje 1
Generisanje izuzetka (2)
Primer – korenovanje negativnog brojaimport 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)
19/24ETF Beograd::Programiranje 1
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
20/24ETF Beograd::Programiranje 1
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))
21/24ETF Beograd::Programiranje 1
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
22/24ETF Beograd::Programiranje 1
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
23/24ETF Beograd::Programiranje 1
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.htm
24/24ETF Beograd::Programiranje 1