You are on page 1of 19

Objektno-orijentisano

programiranje
1. Obradaizuzetaka
Izuzetak (exception)
n Izuzetak je dogaaj koji onemogu!ava regularno
izvr$enje programa.
n Izuzetak treba posebno obraditi izvan osnovnog toka
programa.
q Primeri:
n U izrarzu se pojavilo deljenje nulom,
n Pri rezervaciji memorijskog prostora, u dinami'koj zoni
memorije nije bilo dovoljno mesta,
n Do$lo je do prekora'enja opsega pri pristupu elementima
niza,
n Eksterni uredjaj sa kojeg se 'itaju podaci je u kvaru,
n Do$lo se do kraja datoteke iz koje se 'itaju podaci...
Re$avanje kriti'nih situacija bez
kori$!enja obrade izuzetaka
n Tehnika se zasnovana na kori$!enju statusnih
parametara:
q Svakoj funkciji u kojoj mo(e do!i do pojave ne(eljenog
dogaaja dodaje se statusni parametar 'ija se vrednost menja
ukoliko dodje do pojave tog dogadjaja.
q Nakon poziva funkcije vr$i se ispitivanje vrednosti statusnog
parametra:
q Nedostaci ovog pristupa:
n U funkcijama u kojima se mo(e pojaviti ve!i broj razli'itih ne(eljenih
dogadjaja treba dodavati veliki broj statusnih parametara.
n Ispitivanje vrednosti statusnih parametara mo(e dovesti do nepregledog
koda (veliki broj if naredbi)
n Pri lancu hijerarhijskih poziva f-ja, ukoliko gre$ku treba propagirati prema
vi$em nivou svaki nivo pozivanja treba da izvr$i testiranje da li je do$lo do
gre$ke.
Mehanizam obrade izuzetaka
n Kada pri izvr$enju programa dodje do ne(eljenog
dogadjaja treba izazvati (prijaviti) izuzetak.
n Obrada se na tom mestu prekida i nastavlja u
rutini (hendleru) za obradu izuzetka;
n Izuzetak mo(e biti podatak proizvoljnog tipa koji
se dostavlja hendleru kao argument;
n Za svaki tip izuzetka se defini$e poseban
hendler.
Programska struktura za obradu
izuzetaka
n blok-1 je programski blok unutar kojeg mogu da se
jave izuzeci (deo koda 'ije se izvr$enje nadgleda).
n argument se sastoji od oznake tipa i identifikatora
argumenta.
n ... ozna'avaju univerzalni hendler on se aktivira ako
ne postoji hendler sa adekvatnim tipom izuzetka.
n blok-2 je telo hendlera.
Sintaksa je sledea:






catch (
blok-2
try
blok-1 )
argument
...
Definicijahendler-a
n Definicija hendlera li'i na definiciju funkcije sa ta'no jednim
argumentom.
catch ( Ti pI zuzet ka I meI zuzet ka )
{

}
n Ka(e se da je hendler tipa T ako je njegov argument tipa T,
odnosno ako obrauje izuzetke tipa T.
n blok-2 obrauje izuzetke koji su se javili neposredno u bloku
blok-1 ili u nekoj funkciji koja je pozvana iz bloka blok-1 .
n Nakon izvr$enja blok-2 kontrola se ne vra!a na mesto gde
se pojavio izuzetak (ve! na prvu naredbu iza try-catch
strukture)
n Ako se u blok-1 ne javi izuzetak, preska'u se svi hendleri
(kontrola se prenosi na na prvu naredbu iza try-catch
strukture)
blok-2
Primer try-catch strukture
try {
...
radi();
...
}
catch(const char *pz) {
// Obrada izuzetka tipa znakovnog niza
}
catch(const int i) {
// Obrada izuzetka celobrojnog tipa
}
catch(...) {
// Obrada izuzetka proizvoljnog tipa
// koji nije ni jedan od gornjih
}
Izazivanje (prijava, bacanje) izuzetka
n Izuzetak se prijavljuje naredbom throw 'iji je format:
throw I zr az:
q Izraz svojim tipom odreuje koji hendler !e biti aktiviran
q vrednost izraza se prenosi hendleru kao argument
q Izraz mo(e biti izostavljen samo ako se izuzetak baca iz nekog hendlera
(catch bloka), i tada se, u stvari, isti izuzetak ponovo baca.
n Dejstvo throw naredbe:
q Prekida izvr$enje bloka u kojem se nalazi i svih splja$njih blokova
(uklju'uu!i i funkcijske) dok ne dodje do heandlera za taj tip izuzetka.
q Pri prekidanju izvr$enja vi$e ugnje(denih blokova, iz memorije se bri $u
svi lokalni podaci, i svi podaci kreirani u dinami 'koj zoni memorije.
q Ukoliko se za prijavljeni izuzetak ne pronadje hendler koji ga mo (e
prihvatiti poziva se sistemska funkcija terminate() koja prekida
izvr$enje programa.
Prijavljivanje izuzetka iz funkcija
n Ukoliko u funkicji postoji throw naredba, van try-catch
strukture koja taj tip izuzetka obradjuje, ka(e se da
funkcija prijavljuje izuzetak.
n Izuzetak mo(e da prijavi bilo koja funkcija:
q globalna funkcija,
q 'lanica klase,
q operatorska funkcija,
q konstruktor,
q destruktor,
q ...
Specificiranje tipova izuzetaka koje
funkcija prijavljuje
n U deklaraciji ili definiciji funkcije mo(e da se navede spisak tipova
izuzetaka koje funkcija prijavljuje.
n Spisak tipova izuzetaka koje funkcija prijavljuje se navodi iza
zaglavlja funkcije u opisu
throw ( Ni zTi pova )
n Ako ovakav opis stoji u definiciji funkcije, a funkcija prijavi izuzetak
tipa koji nije u nizu identifikatora, kompajler !e prijaviti gre$ku.
n Ako iza zaglavlja funkcije ne stoji lista tipova izuzetaka koje funkcija
mo(e da prijavi, funkcija sme da prijavi izuzetak proizvoljnog tipa.
n Ako iza zaglavlja funkcije stoji prazna lista dozvoljenih tipova
izuzetaka, funkcija ne sme da prijavi ni jedan izuzetak.
Primer funkcije koja prijavljuje izuzetke
void radi(...) throw(char*, int)
{
if(...)
throw "Izuzetak!";
if(...)
throw 100;
if(...)
throw Tacka(0,0);
// GRESKA: nije dozvoljeno da funkcija
// prijavi izuzetak tipa Tacka
}
Prihvatanje izuzetaka
n Hendler tipa B mo(e da prihvati izuzetak tipa D ako:
q B i D su isti tipovi,
q D je klasa javno izvedena iz klase B,
q B i D su pokaziva'ki tipovi i D mo(e da se standardnom
konverzijom promeni u B.
n Prilikom navoenja hendlera treba se dr(ati slede!ih
pravila:
q hendlere tipa izvedenih iz neke osnovne klase treba stavljati
ispred hendlera tipa te osnovne klase
q univerzalni hendler treba stavljati na poslednje mesto.
Standardni izuzeci
n U standardnoj biblioteci klasa definisana je klasa
exception zaglavlju <exception.h>
n To je osnovna klasa (koren hijerarhije) svih standardnih
izuzetaka
n Metode standardnih klasa i neki operatori prijavljuju
izuzetke klasa izvedenih iz klase exception.
n Preporu'uje se da se i korisni'ki izuzeci izvode iz klase
exception
n Ovako kreirana hijerarhija izuzetaka omogu!ava da se
pojedini tipovi izuzetaka mogu obraivati :
q pojedina'no
q u srodnim grupama
q svi zajedno (ali ipak ne kao ...)
Definicija klase exception
class exception
{
public:
exception() throw();
exception(const exception &)throw();
exception(const char *)throw();
exception& operator=(const exception &)throw();
virtual ~exception()throw();
virtual const char* what() const throw();
};
n what() vra!a pokaziva' na tekstualni opis izuzetka
n Ni jedna metoda ne sme da prijavi ni jedan izuzetak:
q obezbeuje se sa throw()
q to automatski va(i i za date metode u izvedenim klasama (lista
izuzetaka se ne sme pro$iriti)
Primer kori#enja klase exception
// A simple exception-handling example that checks for
// divide-by-zero exceptions.
#include <iostream>
#include <exception>
using namespace std;
/* DivideByZeroException objects should be thrown by
functions upon detecting division-by-zero
exceptions */
class DivideByZeroException : public exception
{
public:
// constructor specifies default error message
DivideByZeroException::DivideByZeroException()
: exception( "attempted to divide by zero" ) {}
}; // end class DivideByZeroException
// perform division and throw DivideByZeroException object if
// divide-by-zero exception occurs
double quotient( int numerator, int denominator )
{
// throw DivideByZeroException if trying to divide by zero
if ( denominator == 0 )
throw DivideByZeroException(); // terminate function
return ( ( double ) numerator ) / denominator;
} // end function quotient
int main()
{
int number1; // user-specified numerator
int number2; // user-specified denominator
double result; // result of division
cout << "Enter two integers: ";
cin >> number1 >> number2;
// try block contains code that might throw exception
// and code that should not execute if an exception occurs
try
{
result = quotient( number1, number2 );
cout << "The quotient is: " << result << endl;
} // end try
// exception handler handles a divide-by-zero exception
catch ( DivideByZeroException &divideByZeroException )
{
cout << "Exception occurred:
<< divideByZeroException.what() << endl;
} // end catch
return 0; // terminate normally
} // end main
Zadatak
n Na programskom jeziku C++ kreirati klasu Vektor koja
modelira niz brojeva tipa double. Privatni atributi klase su:
q Veli'ina vektora i
q Dinami'ki niz elemenata tipa double.
Javni 'lanovi klase su:
q Konstruktor koji postavlja broj elemenata i rezervi$e prostor za njegove
elemente (prijaviti izuzetak ako je broj elemenata negativan ili ako
rezervacija prostora nije uspela),
q Destruktor,
q Metoda za u'itavanje elemenata vektora iz zadate binarne datoteke
(koji prijavljuje izuzetak ako nastane bilo kakva gre$ka pri u'itavanju
podataka),
q Metoda za prikaz elemenata vektora na standardni izlaz.
Zadatak - nastavak
n U funkciji main prepisati na standardni izlaz vrednosti
elemenata vektora koji su zapam!eni u datoteci Vektor.dat.
n Na po'etku datoteke je sme$ten broj elemenata u vektoru.
n Ukoliko datoteka ne mo(e da se otvori bez kreiranja treba
prijaviti izuzetak.
n Ukoliko se u programu prijavi bilo kakav izuzetak, dalji rad
programa prekinuti i na standardni izlaz prikazati poruku o
uzroku prekida rada programa.

You might also like