2. C++ Avancé
2.9. Les Exceptions
Le mécanisme d'exception permet une meilleure gestion des erreurs
basé sur le déclenchement et l'interception d'instances de classes
qui peuvent contenir des informations sur la cause de la levée
de l'exception.
Les exceptions permettent la récupération sur erreur, c'est à dire le
fait de pouvoir traiter une erreur sans que le programme ne termine en
raison de l'erreur générée.
2.9.1. Intercepter une exception : le bloc try catch
try {
... code ...
} catch(exception& e) {
cerr << e.what() << endl;
}
2.9.2. Lever une exception : throw
#include <exception>
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// throws int *
int divide_1(int a, int b) {
if (b == 0) throw new int(0);
return a / b;
}
// throws string
int divide_2(int a, int b) {
if (b == 0) throw string("division by 0");
return a / b;
}
// throws std::exception
int divide_3(int a, int b) {
if (b == 0) throw invalid_argument("division by zero");
return a / b;
}
int main() {
int result;
try {
result = divide_1(10, 2);
cerr << "10 / 2 = " << result << endl;
result = divide_1(10, 0);
cerr << "10 / 0 = " << result << endl;
} catch(int *e_int) {
cout << "exception: thrown for division by " << *e_int << endl;
}
try {
result = divide_2(10, 2);
cerr << "10 / 2 = " << result << endl;
result = divide_2(10, 0);
cerr << "10 / 0 = " << result << endl;
} catch(string& s) {
cout << "exception: " << s << endl;
}
try {
result = divide_3(10, 2);
cerr << "10 / 2 = " << result << endl;
result = divide_3(10, 0);
cerr << "10 / 0 = " << result << endl;
} catch(std::exception& e) {
cout << "exception: " << e.what() << endl;
}
return 0;
}
10 / 2 = 5
exception: thrown for division by 0
10 / 2 = 5
exception: division by 0
10 / 2 = 5
exception: division by zero
2.9.3. Liste d'exceptions levées par un sous-programme
Il est possible de déclarer les exceptions qui peuvent être levées par
un sous-programme en les spécifiant dans la déclaration de la fonction :
void ma_fonction(parameters, ...)
throw (invalid_argument, runtime_error) {
...
}
C++11 introduit le mot clé noexcept si on désire
spécifier qu'un sous-programme ne lève pas d'exception.
Consulter ce lien pour en savoir plus sur les
catégories d'exceptions.