Tratarea-exceptiilor in C++

Embed Size (px)

Citation preview

  • 8/15/2019 Tratarea-exceptiilor in C++

    1/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    Tratarea excepţiilor

    Programatorii adevăraţi trebuie să ia în calcul şi posibilitatea de a crea programe robuste, care fafaţă atât cerinţelor specificate dar nerafinate suficient, cât şi cerinţelor nespecificate dar formulade utilizator, din diverse motive. Programele care au aceste calităţi se numesc robuste.Nu ne bazăm pe atenţia şi buna pregătire a utilizatorului !

    Pentru a face faţă cerinţelor legate de problema tratării excepţiilor (aşa sunt numite în mod cureerorile care apar în timpul execuţiei programelor) anumite limbaje de programare ofer ă  supoadecvat. Aş include aici limbaje precum Delphi, C++, Java, Visual C.Nu toate compilatoarele de C++ ofer ă suport pentru tratarea excepţiilor, dar standardul ANSI C+cere acest lucru în mod explicit. Compilatoarele din familia Borland începând cu versiunea 4ofer ă acest suport.Esenţialul din punctul de vedere al programatorului C++ este ca el să-şi formeze abilitatea de scrie în jurul aplicaţiilor cod C++ care îndeplineşte funcţia de handler de excepţii.Suportul sintactic C++ pentru tratarea excepţiilor se rezumă la trei cuvinte cheie, a căror semanticpreliminar ă o prezentăm în Tabelul următor:

    Cuvântul cheie Semnificaţietry Delimitează  o por ţiune de cod în care se instituie

    controlul sistemului asupra excepţiilor în timpul rulării.throw Lansează o excepţie de un anumit tipcatch Captează o excepţie lansată 

    Forma de bază a tratării excepţiilor Aşadar, atunci când programele dumneavoastr ă  efectuează  prelucrarea excepţiilor, trebuie sincludeţi în cadrul unui bloc try  instrucţiunile pe care doriţi să  le monitorizaţi în vederea un

    excepţii. Dacă  execuţia unei instrucţiuni se termină  cu o eroare, trebuie să  lansaţi o eroacorespunzătoare acţiunii funcţiei în care se află  instrucţiunea. Programul plasează  instrucţiunethrow în cadrul blocului try-catch. Forma generalizată a blocului care captează şi tratează erorieste:

    try{//blocul tryif(eroare) throw valoare_excepţie;

    }catch (Tip_excepţie Nume_variabilă ){

    //Prelucrarea excepţiei

    }

     În cadrul acestei forme generalizate, valoarea valoare_excepţ ie  lansată  trebuie să  corespundtipului Tip_excepţ ie .

    Scrierea unui handler de excepţii simpluPentru a înţelege mai bine semantica unui handler de excepţii, studiaţi programul de mai jos.

  • 8/15/2019 Tratarea-exceptiilor in C++

    2/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    #include void main(){cout

  • 8/15/2019 Tratarea-exceptiilor in C++

    3/9

  • 8/15/2019 Tratarea-exceptiilor in C++

    4/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    catch (tip1){

    //tratare excepţie 1}catch(tip2){

    //tratare excepţie 2}:catch(tipn){

    //tratare excepţie n}

    Cu acest amendament sintactic deducem că  instrucţiunile catch  pot capta orice tip returnat, nnumai tipurile de bază acceptate de C++. Acest "fenomen" este ilustrat în codul de mai jos.

    #include 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

  • 8/15/2019 Tratarea-exceptiilor in C++

    5/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    Blocuri catch generice (utilizarea operatorului puncte de suspensie)Programele scrise de dumneavoastr ă  pot capta excepţii din cadrul mai multor blocuri try (dexemplu un bloc try care incapsuleaza mai multe functii care lanseaza exceptii diferite din blocutry diferite sau să  utilizeze mai multe instrucţiuni catch într-un singur bloc try. C++ permite, dasemenea, utilizarea operatorului puncte de suspensie (…) pentru a capta orice tip de eroare caapare într-un singur bloc try. Sintaxa care permite captarea tuturor erorilor care apar într-un bloc teste prezentată mai jos.

    try{//Instructiuni

    }catch(…){//tratarea exceptiei

    }

    Pentru exemplificare propun codul de mai jos.

    #include void XHandler(int test){try{

    if(test==0)throw test;

    if(test==1)throw 'a';

    if(test==2)throw 121.25;

    }catch(…){

    cout

  • 8/15/2019 Tratarea-exceptiilor in C++

    6/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    #include 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

  • 8/15/2019 Tratarea-exceptiilor in C++

    7/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    //Cod functie}

    Este bine să subliniem că atunci când declaraţi o funcţie cu clauza throw ea poate să lanseze doacele tipuri precizate în listă. Dacă funcţia lansează orice al tip programul este abortat.Un exemplu în continuare.

    #include 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

  • 8/15/2019 Tratarea-exceptiilor in C++

    8/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    try{throw "Salve…";}catch(char *){cout

  • 8/15/2019 Tratarea-exceptiilor in C++

    9/9

    Programarea calculatoarelor C++ s.l.ing. Delia UNGUREAN

    cout