Professional Documents
Culture Documents
06 Izuzeci
06 Izuzeci
programiranje 1
Izuzeci
Pojam izuzetaka
posle izvrenja dela programa (ili poziva funkcije) u kojem moe doi do greke
vri se testiranje statusa
obrada greke se smeta u jednu, a obrada OK statusa u drugu granu if naredbe
u lancu poziva f-ja, ukoliko greku treba propagirati prema prethodnom nivou,
svaki nivo poziva (po povratku) treba da izvri testiranje da li je dolo do greke
ako je dolo do greke koju ne moe u potpunosti da obradi,
funkcija u izrazu return naredbe treba da vrati kod greke
Izuzeci
30.11.2015.
Ilustracije problema
//
//
if ((f2()) { //
//
if ((f3()) {//
//
} else {
//
}
} else {
//
}
} else {
//
}
status==OK
dalja obrada u slucaju pozitivnog ishoda f1()
status==OK
dalja obrada u slucaju pozitivnog ishoda f2()
status==OK
dalja obrada u slucaju pozitivnog ishoda f3()
obrada greske koju je vratila f3()
obrada greske koju je vratila f2()
obrada greske koju je vratila f1()
g2()
g3()
Izuzeci
30.11.2015.
30.11.2015.
blok-1
catch
blok-2
...
Izuzeci
30.11.2015.
30.11.2015.
Primer izuzetka
try {
...
radi(); // funkcija moda baca izuzetak
...
} catch(const char *pz){
// Obrada izuzetka tipa znakovnog niza
} catch(const int i){
// Obrada izuzetka celobrojnog tipa
} catch(...){
// Obrada izuzetka proizvoljnog tipa
// koji nije jedan od gornjih
}
Izuzeci
30.11.2015.
Izazivanje izuzetaka
30.11.2015.
Izuzeci
30.11.2015.
10
Izuzeci
30.11.2015.
Modifikator:
noexcept(izraz)
navodi se iza liste parametara
izraz je konstantan logiki, izvrava se u toku prevoenja
vrednost true oznaava da funkcija nee bacati izuzetke
noexcept noexcept(true) throw ()
Operator:
noexcept(izraz)
rezultat je logikog tipa
izraz moe biti proizvoljnog tipa, ak i void
proverava se da li bi u sluaju izvrenja izraza moglo doi do izuzetka
izraz se ne izraunava, samo se proverava u toku prevoenja
moe se koristiti u izrazu noexcept modifikatora
11
Izuzeci
30.11.2015.
Primer noexcept
void
int
double
int
void
bool
bool
bool
bool
bool
bool
12
f()
g()
h()
i()
j()
noexcept {}
// ne baca
noexcept(false){return 0;} // moze da baca
{return 0.0;}
// moze da baca
throw(){return 0;}
// ne baca
throw (int, double){}
// moze da baca
//
int i double
p=noexcept(f());
// true
q=noexcept(g());
// false
r=noexcept(h());
// false
s=noexcept(i());
// true
t=noexcept(j());
// false
v=noexcept(new int);
// false
Izuzeci
30.11.2015.
R i I su isti tip
R je javna osnovna klasa za izvedenu klasu I
R i I su pokazivaki/upuivaki tipovi i
I standardno moe da se konvertuje u R
13
Izuzeci
30.11.2015.
14
Izuzeci
30.11.2015.
on obrauje izuzetak
ako se iz tog rukovaoca ne baci izuzetak,
obrada nastavlja naredbom posle poslednjeg catch bloka
izuzetak se prosleuje odgovarajuem rukovaocu
prethodnog (spoljnog) nivoa naredbe try
eventualne naredbe u sekvenci iza poslednjeg catch bloka se nee izvriti
15
Izuzeci
30.11.2015.
16
Izuzeci
30.11.2015.
17
Izuzeci
30.11.2015.
return x+y;
// regularan rezultat funkcije
} catch (int g) {
int a=x;
// u redu
int b=y;
// ! GRESKA
return -1;
// rezultat u izuzetnoj situaciji
}
18
Izuzeci
30.11.2015.
posledice su nepredvidive
neki jo nisu inicijalizovani, a one klasne koji su ve bili konstruisani
odgovarajui destruktor je unitio pre izvrenja rukovaoca
19
30.11.2015.
}
// nije obradjen tip int
}
20
Izuzeci
30.11.2015.
Neprihvaeni izuzeci
21
Izuzeci
30.11.2015.
Zamena za abort()
22
Izuzeci
30.11.2015.
Neoekivani izuzeci
23
Izuzeci
30.11.2015.
Zamena za terminate()
24
Izuzeci
30.11.2015.
Standardni izuzeci
25
pojedinano
u srodnim grupama
svi zajedno (ali ipak ne kao ...)
Izuzeci
30.11.2015.
class exception {
public:
exception() noexcept;
exception(const exception &) noexcept;
exception& operator=(const exception &) noexcept;
virtual ~exception() noexcept;
virtual const char* what() const noexcept;
};
what() vraa pokaziva na tekstualni opis izuzetka (std. ne propisuje tekst poruka)
26
obezbeuje se sa noexcept
to automatski vai i za date metode u izvedenim klasama (lista izuzetaka se ne sme proiriti)
Izuzeci
30.11.2015.