Documente Academic
Documente Profesional
Documente Cultură
Cuprins
1. Excepții .................................................................................................................................................. 1
2. Excepții standard................................................................................................................................... 2
3. Excepții netratate .................................................................................................................................. 3
4. Excepții în funcții membre .................................................................................................................... 4
5. Definirea propriilor excepții .................................................................................................................. 5
6. Exerciții.................................................................................................................................................. 6
1. Excepții
Excepţiile reprezintă un mecanism de tratare a erorilor care apar în timpul execuției unui
program. O excepție C++ este răspunsul la o situație excepțională care apare în timp ce un program
rulează, de exemplu împărțirea la 0.
#include <iostream>
int main() {
cout << imp(4, 0);
return 0;
}
#include <iostream>
return (x / y);
}
int main() {
try
{
cout << imp(4, 2) << endl;
cout << imp(4, 0) << endl;
cout << imp(6, 2) << endl;
}
catch (const char* err)
{
cout << err << endl;
}
return 0;
}
Ieșire:
2
Impartire la 0
2. Excepții standard
Biblioteca C++ standard furnizează o clasă de bază pentru tratarea obiectelor furnizate ca
excepţii, std::exception, precum și o serie de clase care o extind pe aceasta și care definesc excepții
pentru tratarea anumitor erori. Lista excepțiilor din biblioteca standard C++ poate fi consultată accesând
http://en.cppreference.com/w/cpp/error/exception.
Clasa std::exception conține o metodă virtuală, what(), ce returnează un char* (un mesaj care
descrie eroarea produsă). În exemplul următor este utilizată std::out_of_range pentru tratarea erorii
care apare atunci când se încearcă accesarea unui element dintr-un vector, aflat pe o poziție mai mare
decât dimensiunea acestuia minus 1.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a(3, 0);
try
{
cout << a.at(3) << endl;
}
catch(out_of_range &e)
{
cout << e.what() << endl;
}
return 0;
}
3. Excepții netratate
Funcţiile pot lansa excepţii care pot să nu aibă nici o modalitate de tratare a lor. Pentru a
preveni aceste situaţii, se poate introduce un handler catch-all:
#include <iostream>
using namespace std;
int main() {
try
{
cout << imp(4, 2) << endl;
cout << imp(4, 0) << endl;
cout << imp(6, 2) << endl;
}
catch (int e)
{
cout << "Eroare: " << e << endl;
}
catch (...)
{
cout << "Eroare necunoscuta" << endl;
}
return 0;
}
4. Excepții în funcții membre
Se folosesc:
În special în constructori pentru a semnala unele erori la crearea obiectelor;
Când se doreşte semnalarea unei erori fără a duce la terminarea programului.
#include <iostream>
class A
{
public:
A()
{
throw "Exceptie in construcorul clasei A!";
}
};
int main()
{
try
{
A a;
}
catch(const char* e)
{
std::cout << e << std::endl;;
}
return 0;
}
5. Definirea propriilor excepții
#include <iostream>
#include <exception>
using namespace std;
return (x / y);
}
int main()
{
try
{
cout << imp(4, 0);
}
catch(MyException &e)
{
cout << e.what() << endl;
}
return 0;
}
6. Exerciții
1. Implmentați exemplele din laborator. Testați și alte (minim 3) excepții din biblioteca standard.
2. Fie clasa Student declarată astfel:
class Student
{
std::string m_sNume;
int m_iNotaP2;
public:
Student(std::string nume, int notaP2);
void Afisare();
};
Adăugați definițiile pentru metodele clasei Student;
În constructorul de inițializare verificați dacă notaP2 se află în itervalul [1, 10]. În caz contrar,
aruncați o excepție proprie.
Testați metodele implementate folosind următorul cod pentru funcția main:
int main()
{
Student s1("Jeff Bezos", 12);
Student s2("Bill Gates", -5);
Student s3("Steve Jobs", 9);
return 0;
}