From 03b2f1628a01d58a34c417d494b27454a4df1419 Mon Sep 17 00:00:00 2001 From: Teodor Date: Wed, 23 Mar 2022 13:15:09 +0200 Subject: [PATCH] init --- POO_22_C_2022-03-17.md | 105 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 POO_22_C_2022-03-17.md diff --git a/POO_22_C_2022-03-17.md b/POO_22_C_2022-03-17.md new file mode 100644 index 0000000..be637bf --- /dev/null +++ b/POO_22_C_2022-03-17.md @@ -0,0 +1,105 @@ +## TRATAREA EXCEPTIILOR +Exceptiile sunt niste situatii deosebite ce pot aparea pe parcursul executiei unei aplicatii. Exista exceptii **sincrone** si exceptii **asincrone**. +Exceptiile sincrone sunt usor de detectat: impartire prin 0, un fisier nu a putut fi deschis, etc. +Exceptiile asincrone sunt mult mai greu de detectat si de tratat. +Exceptiile sunt in general erori ce pot aparea in timpul functionarii unui program. O data detectate, exceptiile trebuie tratate. +Exemple de masuri: +- se afiseaza mesaje pe ecran sau in log +- se reincearca executia unei secvente de program sau se reporneste executia +In limbajul C, tratarea exceptiilor poate fi facuta cu ajutorul unor functii din fisierul antet ```setjmp.h```. Pentru tratarea exceptiilor avem nevoie de tipuri de date ```jmp_buf```, functia ```setjmp``` si functia ```longjmp```. +Intr-o variabila de tip ```jmp_buf``` poate fi incarcata starea programului din momentul apelului functiei ```setjmp```. Prin starea programului intelegem stiva de executie a aplicatiei. La primul apel al functiei ```setjmp```, functia returneaza valoarea ```0```. Cu ajutorul functiei ```longjmp``` ne putem intoarce la linia in care ```setjmp``` a salvat starea executiei, moment in care se reincarca starea executiei salvata. Cu alte cuvinte, apelul ```longjmp``` este echivalent cu incarcarea stivei de executie dintr-o variabila ```jmp_buf``` si un ```goto``` la linia in care ```setjmp``` a salvat starea programului. Cu ajutorul acestor doua functii este simulata functionalitatea unei instructiuni de tipul ```try catch``` impreuna cu ```throw```, care nu exista in C. + +```cpp +jmp_buf stare; +float div(float x, float y) +{ + if(!y) + long_jmp(stare,1); // throw + else + return x/y; +} + +void main() +{ + float a,b; + cin>>a>>b; + if(!setjmp(stare)) + { + cout<<"Impartire = "<< div(a,b) << endl; + } + else + { + cerr<"Exceptie"<>a>>b; + try + { + cout<<"log = "< ```int```, ```int``` -> ```float```). Daca valoarea aruncata nu poate fi convertita la niciunul din tipurile ramurilor catch, executia continua pe ramura ```catch(...)``` , daca exista, unde este tratata sau exceptia ramane netratata, rezultand eroare la executie: ```Unhandled exception.```. +Exista, in functie de compilator, si alte posibile ramuri ale instructiunii ```try...catch```. De exemplu, Visual C++ putem sa avem ramuri de tip ```except``` sau ```final```, dar nu sunt standard. In Java exista ```final``` standard. +Instructiunea ```throw``` poate fi apelata fara valoare. La intalnirea unui ```throw``` fara valoare, daca exista o valoare aruncata si inca netratata, ea este aruncata pentru a fi tratata in urmatoarea instructiune ```try...catch```. +```cpp +float a,b; +cin>>a>>b; +try +{ + try + { + if(!b) + throw 0; + cout<