Sunteți pe pagina 1din 9

CAPITOLUL 8

Exceptii si tratarea acestora

Exceptii si tratarea acestora

1.Excepţii2.Modalităţi de tratare a excepţiilorCAP. 8

CAP. 8

8.1. Excepţii

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

Î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

Exceptii si tratarea acestora


Aruncarea unei excepții nu garantează că excepţia va fi şi tratată în afara funcţiei. Pentru aceasta,
trebuie specificată o secvenţă de cod care detecteazăsau prindeexcepţiaşi o tratează.Programatorul
trebuie să includă într-un bloctrycodul care ar putea genera o eroare generatoare a unei excepţii. Blocul
tryeste urmat de unul sau mai multe blocuri catch. Fiecare bloc catchspecifică tipul excepţiei pe care o
poate detectași va executa blocul corespunzator tipului excepției.

CAP. 8

8.1. Excepţii

Exceptii si tratarea acestora

#include <iostream>using namespace std;intmain () {try{throw 20;}catch (inte){cout<< "An exception


occurred. Exception Nr. " << e << '\n';}return 0;}

10

CAP. 8

8.1. Excepţii

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora


Excepţiilesuntinterceptateşiprelucratefolosindconstrucţiatryşicatch, care are sintaxa:try{//codulcare
arputeagenera erori}catch(Tip1 Var1){//tratareexceptie}...catch(TipnVarN){//tratareexceptie}Fiecarebloc
catchare întreparantezerotundetipulde excepţiecare vafi interceptatşiprelucratde bloculde instrucţiuni.

13

CAP. 8

8.1. Excepţii

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

Înmodobişnuit,într-unprogrampotapăreamaimultetipurideerorideexecuţie(run-
timeerrors)şifiecaretipdeeroarepoatefiasociatuneiexcepţiicuunnumedistinct.Captareaexcepţiiloresteexe
cutatădemaimulteblocuricatch,carepotfiasociateunuiasaumaimultorblocuritry.

16

CAP. 8

8.1. Excepţii

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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.

Exceptii si tratarea acestora

19

1.Excepţii2.Modalităţi de tratare a excepţiilorCAP. 8

20

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

În C++ există mai multe modalităţi de tratare a excepţiilor. TratareatuturorexcepţiilorTransferul de


informaţii către rutina de tratare a excepţiei Imbricarearutinelorde tratarea
excepţiilorGrupareaexcepţiilor

21

CAP. 8

8.2. Modalităţi de tratare a excepţiilor


Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

TratareatuturorexcepţiilorMaiesteposibilăcombinareauneiasaumaimultorinstrucţiunicatchdecaptareaun
ortipurispecificedeexcepţiicuoinstrucţiunedecaptareatuturorexcepţiilor,combinaţieprincareseurmăreşte
tratareadiferenţiatăaunoranumitetipurideexcepţii,toatecelelaltefiindtratateglobal.Astfeldeconstrucţiiper
mitevitareaterminăriianormaleaprogramului.

23

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

TratareatuturorexcepţiilorDacă se adaugă după blocul try o instrucţiune catch(…) de captare generală,


atunci nu mai apare eroarea de execuţie la lansarea unei excepţii netratate specific: //…………………………..
try{ // acelasi bloc ca in exemplul de mai sus} catch(inti){ cout<< "Captareexceptieinti = " << i <<endl; }
catch(double d){ cout << "Captareexceptiedouble d = " << d <<endl; } catch(…){ cout<<
"Captareexceptieoarecare\n”; } //…………………………….

24

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

TratareatuturorexcepţiilorLa lansarea excepţiei cu argument de tip caracter (throw argc) se transferă


controlul rutinei de captare generală a excepţiilor (care, în exemplul de mai sus afişează doar un mesaj la
consolă) şi nu mai apare execuţia anormală a programului.

25

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora


TratareatuturorexcepţiilorTransferul de informaţii către rutina de tratare a excepţiei
Imbricarearutinelorde tratarea excepţiilorGrupareaexcepţiilor

26

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

TratareatuturorexcepţiilorTransferul de informaţii către rutina de tratare a excepţiei


Imbricarearutinelorde tratarea excepţiilorGrupareaexcepţiilor

28

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

TratareatuturorexcepţiilorTransferul de informaţii către rutina de tratare a excepţiei


Imbricarearutinelorde tratarea excepţiilorGrupareaexcepţiilor

31

CAP. 8

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

8.2. Modalităţi de tratare a excepţiilor

Exceptii si tratarea acestora

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

1.Conceptede bazaale programariiorientate


peobiecte2.Clasesiobiecte3.Supraincarcareaoperatorilor4.Creareaierarhiilorde clase5.Operatiide intrare/
iesirein limbajulC++6.Implementariale modelelorde
date7.Functiisiclasegenerice8.ExceptiisitratareaacestoraCuprinsulCursului

Programareacalculatoarelorşilimbajede programareII

S-ar putea să vă placă și