programiranje 1 uvod u programski jezik...

24
Programiranje 1 Obrada grešaka na programskom jeziku Python Univerzitet u Beogradu Elektrotehnički fakultet 2019/2020.

Upload: others

Post on 16-Jan-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

Programiranje 1

Obrada grešakana programskom jeziku Python

Univerzitet u Beogradu

Elektrotehnički fakultet

2019/2020.

Page 2: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 3: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 4: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 5: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 6: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 7: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 8: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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.

Page 9: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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.

Page 10: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 11: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 12: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 13: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 14: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 15: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 16: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 17: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 18: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 19: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 20: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 21: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 22: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 23: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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

Page 24: Programiranje 1 Uvod u programski jezik Pythonrti.etf.bg.ac.rs/rti/ir1p1/materijali/predavanja/P1_Python_izuzeci.pdf · Programiranje 1 Obrada grešaka na programskom jeziku Python

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