Documente Academic
Documente Profesional
Documente Cultură
CAP. 8
8.1. Excepţii
Limbajul C++ oferă un mecanism de rezolvare în mod unitar a erorilor apărute la execuţie; Mecanismul
de tratare a excepţiilor permite ca o problemă apărută într-o funcţie –problemă pe care funcţia nu o
poate rezolva -să fie definită ca o excepţie, cu speranţa că funcţia apelantă va trata această problemă.
CAP. 8
8.1. Excepţii
O excepție este o eroare care poate să aparăla rularea unui program.Exemple:•încercarea de deschidere
a unui fișier ce nu există•depășirea limitelor unui tablou•încercarea de alocare a unui spațiu de
memoriece depășește dimensiunea heap-ului•erori aritmetice•etc.
CAP. 8
8.1. Excepţii
În cazul apariției unei erori se poate afișa eroarea propriuzisă șiapoi se continuăexecuția sau se termină
programul după afișare.In C++ tratarea excepțiilor se face folosindtry,throwşi catch.Tratarea excepţiilor
în C++ este o metodă care se aplică atunci când funcţia care detectează o eroare nuo şi tratează.
CAP. 8
8.1. Excepţii
CAP. 8
8.1. Excepţii
10
CAP. 8
8.1. Excepţii
Ofuncţiecaredoreştesătratezeastfeloeroarevaindicaacestlucruprincaptareaexcepţieirespective,iarcodulc
areseexecutălacaptaresenumeşterutinădetratareaexcepţiei(engl.exceptionhandler).Rutinade tratarea
excepţieiesteo construcţiede forma: catch ( /*…..…… */){ // ……. } Rutina este apelată imediat după un
bloc prefixat de cuvântul cheie trysau după o altă rutină de tratare a unei excepţii. Paranteza care
urmează cuvântului cheie catchconţine o declaraţie care este folosită ca un argument, declaraţie care
specifică tipul excepţiei tratate de către rutină şi, uneori, numele argumentului.
11
CAP. 8
8.1. Excepţii
Dacă o excepţie (practic, o eroare) apare într-un bloc prefixat de specificatorul try, ea este lansată de
către instrucţiunea throw, după care este captată într-o rutină de tratare a excepţiilor (deci în blocul
instrucţiunii catch) şi prelucrată.Blocul trytrebuie să conţină acea secţiune a programului în care se
doreşte să fie căutate erorile şi poate cuprinde câteva instrucţiuni într-o funcţie sau chiar întregul corp al
funcţiei main(), ceea ce înseamnă urmărirea erorilor în întregul program.
12
CAP. 8
8.1. Excepţii
13
CAP. 8
8.1. Excepţii
Atuncicândofuncţiegenereazăoexcepţie,eanuîşimaicontinuăexecuţiacaînsituaţiaîncarearapelaofuncţiede
tratareaerorii(dincareserevineprintr-
oinstrucţiunereturn),ciexecuţiaestecaptatăînrutinadetratare,dupăcaresecontinuăprogramulcuinstrucţiun
ilecareurmeazărutineidetratareaexcepţiei.
14
CAP. 8
8.1. Excepţii
Important!!!Blocurile tryşi catchformează o singură construcţie (nu se poate folosi un bloc tryfără cel
puţin un bloc catchşi nu se poate folosi un bloc catchfără un bloc try).Între cele două blocuri nu pot
exista alte secvenţe de instrucţiuni. Se pot înlănţuioricâte blocuri catch, câte unul pentru fiecare tip de
excepţie ce se doreşte a fi tratată.. https://www.math.uaic.ro/~mapetrii/POO/depozit/Curs6.pdf
15
CAP. 8
8.1. Excepţii
Înmodobişnuit,într-unprogrampotapăreamaimultetipurideerorideexecuţie(run-
timeerrors)şifiecaretipdeeroarepoatefiasociatuneiexcepţiicuunnumedistinct.Captareaexcepţiiloresteexe
cutatădemaimulteblocuricatch,carepotfiasociateunuiasaumaimultorblocuritry.
16
CAP. 8
8.1. Excepţii
Forma generală pentru un bloc try urmat de mai multe blocuri catch care tratează diferite tipuri de
excepţii este următoarea: try { // bloc try } catch (tip_arg1 arg1) { // bloc de tratare a excepţiei de tipul
tip_arg1 } catch (tip_arg2 arg2) { // bloc catch de tratare a excepţiei de tipul tip_arg2 }
…………………………………. catch (tip_argnargn) { // bloc de tratare a excepţiei de tipul tip_argn }
17
CAP. 8
8.1. Excepţii
Oastfeldeconstrucţieesteasemănătoareuneiinstrucţiuniswitch,încareselecţiauneirutine(unbloccatch)sefa
ceînfuncţiedetipulexcepţieilansateînblocultry,fărăsăfienecesarăoinstrucţiunebreak.Dacăînblocultrynuap
arenicioexcepţie,toateblocurilecatchconsecutiveacestuiasuntignorate.Laapariţiauneiexcepţii,controlulpr
ogramuluiestetransferatrutineidetratareaexcepţieicorespunzătoaretipuluiacesteia,toatecelelateblocuric
atchfiindignorate.
18
CAP. 8
8.1. Excepţii
Dupăexecuţiauneirutinedetratareaexcepţiei,programulpoatecontinuacuexecuţiainstrucţiunilorurmătoar
eblocurilorcatch,sausepoatetermina,dacărutinarespectivăaapelatofuncţieexit()sauabort().Dacăselanseaz
ăoexcepţiepentrucarenuexistăniciorutinădetratare(bloccatch),atunciesteposibilsăaparăoexecuţieanorma
lăaprogramului.
19
20
CAP. 8
21
CAP. 8
TratareatuturorexcepţiilorSepoatefolosioconstrucţiedecaptareaatuturorexcepţiilorcuurmătoareasintaxă:
catch(…){//trataregeneralăexcepţii}Instrucţiunea catch(…) indică captarea oricăror excepţii
(corespunzătoare tuturor tipurilor de date). Tratarea excepţiilor în astfel de situaţii poate fi o tratare
generală.
22
CAP. 8
TratareatuturorexcepţiilorMaiesteposibilăcombinareauneiasaumaimultorinstrucţiunicatchdecaptareaun
ortipurispecificedeexcepţiicuoinstrucţiunedecaptareatuturorexcepţiilor,combinaţieprincareseurmăreşte
tratareadiferenţiatăaunoranumitetipurideexcepţii,toatecelelaltefiindtratateglobal.Astfeldeconstrucţiiper
mitevitareaterminăriianormaleaprogramului.
23
CAP. 8
24
CAP. 8
25
CAP. 8
26
CAP. 8
Transferul de informaţii către rutina de tratare a excepţiei O excepţie poate fi captată prin specificarea
tipului ei. Totuşi, ceea ce se lansează (throw) în momentul apariţiei unei erori nu este un tip de date ci
un obiect de tipul respectiv, care este construit la apariţia erorii. De aceea, în definirea unui tip excepţie
(clasă) se pot adăuga date membrecare pot fi setate la construcţia obiectului lansat şi utilizate în rutina
de tratare a excepţiilor pentru identificarea condiţiilor de apariţie a erorii.
27
CAP. 8
28
CAP. 8
Imbricarea rutinelor de tratare a excepţiilor Limbajul C++ admite construcţii imbricate de tratare a
execpţiilor, ca de exemplu: try{// bloc try } catch (ExceptionX){try { // o rutină care incearcă tratarea
excepţiei } catch(ExceptionX){ // o alta rutină de tratare care este lansată dacă prima rutină a provocat
o // nouă excepţie } }
29
CAP. 8
Imbricarea rutinelor de tratare a excepţiilor O excepţie este tratată de rutina imediat următoare blocului
try, dar şi în această tratare poate fi lansată o nouă excepţie (eventual de acelaşi tip), de care se va
ocupa un nou bloc catch, imbricat în primul bloc try. Deşi posibile, astfel de construcţii imbricate sunt rar
utilizate sau utile.
30
CAP. 8
31
CAP. 8
Gruparea excepţiilor De cele mai multe ori, excepţiile se pot grupa în familii, în funcţie de categoria la
care se referă.De exemplu: -erorile de depăşire superioară, de depăşire inferioară şi de împărţire la zero
pot fi grupate în categoria de erori în operaţii aritmetice cu numere flotante; -erorile de deschidere
fişier, de închidere fişier, erori de citire sau erori de scrire, pot fi grupate în categoria (familia) erorilor în
operaţii cu fişiere,etc.
32
CAP. 8
Gruparea excepţiilor În astfel de situaţii, rutinele de tratare a excepţiilor sunt destul de asemănătoare şi
se pot implementa într-un mod unitar. Implementarea unitară a grupurilor de excepţii se poate face în
două modalităţi: 1. prinenumerare; 2. prinorganizareaexcepţiilorînierarhiide
clasefolosindmoştenireaşifuncţiilevirtuale.
33
CAP. 8
Gruparea excepţiilor În abordarea prin enumerare a grupurilor de excepţii se defineşte un tip enumerare
ale cărui posibile valori sunt numele tuturor excepţiilor din grup, iar selecţia între rutinele specifice se
face printr-o instrucţiune switch: class Overflow { }; class Underflow { }; class Dividebyzero{ };
enumMathenum{Overflow, Underflow, Dividebyzero};
34
CAP. 8
8.2. Modalităţi de tratare a excepţiilor
Gruparea excepţiilor void fenum(){ try{ // lansareexcepţii} catch (Mathenumm){ switch (m){ case
Overflow: // trataredepasiresuperioarabreak; case Underflow: // trataredepasireinferiorabreak; case
Dividebyzero: // tratareimpartirela 0 break; } } }
35
CAP. 8
Gruparea excepţiilor O astfel de organizare a grupurilor de excepţii, deşi posibilă, este voluminoasăşi cu
mari riscuri de a fi omise unele situaţii, care, bineînţeles, vor provoca terminarea anormală a
programului. În plus, la adăugarea unei noi excepţii într-un grup de excepţii ale unei biblioteci, ar fi
necesară recompilarea tuturor modulelor care conţin rutine de captare a excepţiilor. Acest lucru este,
bineînţeles, imposibil şi de aceea ar fi preferabil să nu se adauge noi excepţii într-o bibliotecă dacă
tratarea grupurilor de excepţii este implementată prin enumerarea acestora.
36
CAP. 8
Gruparea excepţiilor Organizarea excepţiilor în ierarhii de clase constituie o soluţie mai elegantă şi mai
robustă, aşa cum ilustrează exemplul următor: class Matherr{ }; class Overflow : public Matherr{ }; class
Underflow : public Matherr{ }; class Dividebyzero: public Matherr{ }; void fder(){ try{ // lansareexcepţii}
catch (Overflow){ // trataredepasiresuperioara} catch (Matherr){ // tratareoriceexceptieMatherrcare nu
esteOverflow } }
37
CAP. 8
Gruparea excepţiilor În acest exemplu, dintre toate excepţiile care pot fi lansate în blocul try, excepţia
Overfloware o tratare specială, în timp ce toate celelalte excepţii derivate din clasa Matherrau o tratare
globală prin rutina catch(Matherr), deci nu vor provoca terminarea anormală a programului.
38
SFARSITUL Capitolului8
CAP. 8Exceptii si tratarea acestora
PROGRAMAREACALCULATOARELORŞILIMBAJEDE PROGRAMAREII
Programareacalculatoarelorşilimbajede programareII