La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation

14 Aug 2021 14 Aug 2021 8150 vues ESSADDOUKI Mostafa 4 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

Les erreurs en C++ se classent en deux catégories : les erreurs de compilation (syntaxe, bibliothèque manquante) et les erreurs d'exécution (exceptions), qui surviennent lors de l'exécution et peuvent provoquer un arrêt brutal du programme si elles ne sont pas gérées.

Exception

Une exception est un événement anormal survenant à l'exécution (ex. : division par zéro, index hors bornes). En C++, toutes les exceptions dérivent de la classe std::exception. Si elle n'est pas interceptée, le programme se termine anormalement.

Pourquoi utiliser la gestion des exceptions ?

AvantageExplication
Séparation du code d'erreurLe code de gestion des erreurs est séparé du flux normal, améliorant la lisibilité
Propagation flexibleUne exception peut être interceptée à n'importe quel niveau de la pile d'appels
Regroupement par typeLes exceptions peuvent être organisées en hiérarchies de classes

Gestion des exceptions

La gestion des exceptions C++ repose sur trois mots-clés : try, catch et throw.

   
Syntaxe try / catch / throw C++
try {
    // code protégé
    if (condition_erreur) throw valeur_exception;
} catch (TypeException e1) {
    // traitement de l'exception e1
} catch (TypeException e2) {
    // traitement de l'exception e2
} catch (...) {
    // attrape tout type d'exception
}
Mot-cléRôle
tryDélimite le bloc de code à surveiller
throwLève une exception ; l'opérande détermine le type levé
catchIntercepte une exception d'un type spécifié ; catch(...) attrape tout

  Exemple n°1 — Division par zéro avec throw et catch

#include <iostream>
using namespace std;

double division(int a, int b) {
    if (b == 0) throw "Division par zéro!";
    return (a / b);
}

int main() {
    int a=5, b=0, res;
    try {
        res = division(a, b);
        cout << "résultat = " << res << endl;
    } catch (const char* msg) {
        cerr << msg << endl;
    }
    cout << "bye bye";
    return 0;
}
Sortie
Division par zéro!
bye bye
Type du catch doit correspondre au throw

Si throw lance un const char*, le catch doit capturer un const char*. Un catch(int) ne l'intercepterait pas et le programme se terminerait anormalement.

Exceptions C++ standard

C++ fournit une hiérarchie d'exceptions standard dans <stdexcept> dérivant toutes de std::exception :

ExceptionDescription
std::bad_allocLancée par new en cas d'échec d'allocation
std::bad_castLancée par dynamic_cast
std::logic_errorErreur détectable à la lecture du code
std::domain_errorDomaine mathématique invalide
std::invalid_argumentArgument invalide
std::out_of_rangeAccès hors de la plage valide
std::runtime_errorErreur détectable uniquement à l'exécution
std::overflow_errorDébordement arithmétique

Exceptions définies par l'utilisateur

On peut créer ses propres exceptions en héritant de std::exception et en surchargeant la méthode what().

  Exemple — Classe d'exception personnalisée

#include <iostream>
#include <exception>
using namespace std;

class DivisionError : public exception {
public:
    const char* what() const throw() {
        return "Division par zero!\n";
    }
};

double division(int a, int b) {
    if (b == 0) throw DivisionError();
    return (a / b);
}

int main() {
    int a=5, b=0, res;
    try {
        res = division(a, b);
        cout << "résultat = " << res << endl;
    } catch (DivisionError& e) {
        cerr << e.what() << endl;
    }
    cout << "bye bye";
    return 0;
}
Sortie
Division par zero!
bye bye
Méthode what()

La méthode what(), héritée de std::exception, retourne une description textuelle de l'exception. La surcharger dans vos classes personnalisées est la convention standard en C++.

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.