Programatorii adevrai trebuie s ia n calcul i posibilitatea de a crea programe robuste, care fac
fa att cerinelor specificate dar nerafinate suficient, ct i cerinelor nespecificate dar formulate
de utilizator, din diverse motive. Programele care au aceste caliti se numesc robuste.
Nu ne bazm pe atenia i buna pregtire a utilizatorului !
Pentru a face fa cerinelor legate de problema tratrii excepiilor (aa sunt numite n mod curent
erorile care apar n timpul execuiei programelor) anumite limbaje de programare ofer suport
adecvat. A include aici limbaje precum Delphi, C++, Java, Visual C.
Nu toate compilatoarele de C++ ofer suport pentru tratarea excepiilor, dar standardul ANSI C++
cere acest lucru n mod explicit. Compilatoarele din familia Borland ncepnd cu versiunea 4.0
ofer acest suport.
Esenialul din punctul de vedere al programatorului C++ este ca el s-i formeze abilitatea de a
scrie n jurul aplicaiilor cod C++ care ndeplinete funcia de handler de excepii.
Suportul sintactic C++ pentru tratarea excepiilor se rezum la trei cuvinte cheie, a cror semantic
preliminar o prezentm n Tabelul urmtor:
Cuvntul cheie
try
throw
catch
Semnificaie
Delimiteaz o poriune de cod n care se instituie
controlul sistemului asupra excepiilor n timpul rulrii.
Lanseaz o excepie de un anumit tip
Capteaz o excepie lansat
#include <iostream.h>
void main()
{
cout<<"Start"<<endl;
try
{
cout<<"In interiorul blocului try"<<endl;
throw 100;
cout<<"Nu se va executa";
}
catch (int i)
{
cout<<"Am captat o excepie -- valoarea este:";
cout<< i <<endl;
}
cout<<"Sfarsit";
};
Programul de mai sus implementeaz un bloc try-catch simplu. n loc s se atepte ca programul
s eueze datorit unei erori, se utilizeaz instruciunea throw pentru lansarea erorii prezumtive.
Dup ce blocul try lanseaz eroarea, blocul catch o capteaz i prelucreaz valoarea transmis
de instruciunea throw. Este evident i din acest exemplu c mecanismul try-throw-catch ofer
suport pentru rezolvarea problemei tratrii excepiilor dar nu rezolv de la sine aceast problem.
Altfel spus, tratarea corect a excepiilor unui program este o problem de atitudine ca
proiectant i ca programator.
//instruciuni
catch (tip1)
{
//tratare excepie 1
}
catch(tip2)
{
//tratare excepie 2
}
:
catch(tipn)
{
//tratare excepie n
}
Cu acest amendament sintactic deducem c instruciunile catch pot capta orice tip returnat, nu
numai tipurile de baz acceptate de C++. Acest "fenomen" este ilustrat n codul de mai jos.
#include <iostream.h>
void XHandler(int test)
{
try
{
if(test==0)
throw test;
if(test==1)
throw "Sir de caractere";
if(test==2)
throw 121.25;
}
catch(int i)
{
cout<<"Am captat exceptia #:"<<i<<endl;
}
catch(char *sir)
{
cout<<"Am captat exceptia de tip sir de caractere:"<<sir<<endl;
}
catch(double d)
{
cout<<"Am captat exceptia #:"<<d<<endl;
}
};
void main()
{
XHandler(0);
XHandler(1);
XHandler(2);
cout<<"Sfarsit";
};
Programarea calculatoarelor C++
#include <iostream.h>
void XHandler(int test)
{
try
{
if(test==0)
throw test;
if(test==1)
throw 'a';
if(test==2)
throw 121.25;
}
catch(int i)
{
cout<<"Am captat o exceptie de tip intreg"<<endl;
}
catch()
{
cout<<"Am captat o exceptie generica"<<endl;
}
};
void main()
{
cout<<"Start:"<<endl;
XHandler(0);
XHandler(1);
XHandler(2);
cout<<"Sfarsit";
};
Restrictionarea exceptiilor
Pe msur ce programele dumneavoastr devin mai complexe, ele vor apela frecvent funcii din
cadrul unui bloc try. Atunci cnd programele dumneavoastr apeleaz funcii dintr-un bloc try,
putei restriciona tipurile de excepii pe care funcia apelat le poate lansa. De asemenea putei
preveni lansarea oricrei excepii dintr-o anumit funcie.
Sintaxa pentru restricionare este:
tip_returnat nume_functie(lista_arg) throw(lista_tipuri )
{
//Cod functie
}
Sintaxa care inhib lansare oricrei excepii este:
tip_returnat nume_functie(lista_arg) throw()
{
Programarea calculatoarelor C++
//Cod functie
Este bine s subliniem c atunci cnd declarai o funcie cu clauza throw ea poate s lanseze doar
acele tipuri precizate n list. Dac funcia lanseaz orice al tip programul este abortat.
Un exemplu n continuare.
#include <iostream.h>
void XHandler(int test) throw(int, char, double)
{
if(test==0)
throw test;
if(test==1)
throw 'a';
if(test==2)
throw 121.25;
}
void main()
{
cout<<"Start:"<<endl;
try
{
XHandler(0);
}
catch(int i)
{
cout<<"Am captat un intreg"<<endl;
}
catch(char c)
{
cout<<"Am captat un caracter"<<endl;
}
catch(double d)
{
cout<<"Am captat un double"<<endl;
}
cout<<"Sfarsit";
};
try
{
throw "Salve";
}
catch(char *)
{
cout<<"Am captat char* in XHandler "<<endl;
throw;
}
void main()
{
cout<<"Start"<<endl;
try
{
XHandler();
}
catch(char *)
{
cout<<"Am captat char * in main"<<endl;
}
cout<<"Sfarsit";
};
cout<<Introduceti numitorul
cin j;
div(i,j);
} while (i!=0);
};
:"<<endl;