Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Langue C

Maîtriser la gestion d'exceptions en C++ : Exemples pratiques try, catch, throw

Qu'est-ce que la gestion d'exceptions en C++ ?

La gestion d'exceptions permet aux programmes C++ de récupérer gracieusement des erreurs d'exécution inattendues. Lorsqu'une erreur se produit, le contrôle saute vers un gestionnaire spécial qui peut décider comment réagir.

En enfermant le code potentiellement problématique dans un bloc try suivi d'une ou plusieurs clauses catch, vous donnez au programme un chemin clair pour gérer les conditions exceptionnelles.

Si aucune exception n'est levée, le bloc try s'exécute normalement et les gestionnaires sont ignorés.

Dans ce tutoriel, vous apprendrez :

Pourquoi la gestion d'exceptions ?

La gestion d'exceptions offre plusieurs avantages tangibles :

Mots-clés clés de la gestion d'exceptions

Trois mots-clés forment l'épine dorsale de la gestion d'exceptions en C++ :

Le code à l'intérieur du bloc try est appelé code protégé ; s'il lève une exception, le bloc catch correspondant est exécuté.

Syntaxe

try {
    // code protégé
} catch (Exception_Name exception1) {
    // gérer exception1
} catch (Exception_Name exception2) {
    // gérer exception2
} // ... plus de blocs catch

Exemple 1 : Accès à un élément de vector hors limites

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    try {
        vec.at(2); // hors limites
    } catch (exception& ex) {
        cout << "Exception occurred!" << endl;
    }
    return 0;
}

Sortie :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Voici une capture d'écran du code :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Décomposition du code :

  1. Inclure iostream et vector pour les E/S et le support de conteneur.
  2. Utiliser l'espace de noms std pour éviter les noms pleinement qualifiés.
  3. Instancier un vector<int> et le peupler.
  4. Tenter d'accéder à un élément au-delà des limites du vector dans un bloc try.
  5. Intercepter l'exception standard std::exception et afficher un message.
  6. Retourner depuis main.

Exemple 2 : Gestion de la division par zéro

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {
    if (y == 0) {
        throw "Division by Zero!";
    }
    return static_cast<double>(x) / y;
}
int main() {
    int a = 11;
    int b = 0;
    double c = 0;
    try {
        c = zeroDivision(a, b);
        cout << c << endl;
    } catch (const char* message) {
        cerr << message << endl;
    }
    return 0;
}

Sortie :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Voici une capture d'écran du code :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Décomposition du code :

  1. Définir zeroDivision qui lève une chaîne C quand on divise par zéro.
  2. Appeler la fonction dans un bloc try et afficher le résultat.
  3. Intercepter l'exception de type chaîne et afficher un message d'erreur.

Exceptions standard C++

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

La bibliothèque standard déclare une riche hiérarchie d'exceptions dans <exception>. Voici les plus fréquemment utilisées :

ExceptionDescription
std::exceptionClasse de base pour toutes les exceptions standard.
std::bad_allocLevée par new en cas d'échec d'allocation.
std::bad_castLevée par dynamic_cast quand un cast échoue.
std::bad_exceptionUtilisée pour signaler une exception inattendue.
std::bad_typeidLevée par typeid sur un glvalue de type polymorphe qui est nul.
std::logic_errorErreurs détectables par le programmeur.
std::domain_errorDomaine invalide pour une fonction mathématique.
std::invalid_argumentFonction a reçu un argument invalide.
std::length_errorTentative de créer une chaîne trop grande.
std::out_of_rangeLevée par vector::at quand l'index est hors limites.
std::runtime_errorErreurs d'exécution non capturées par d'autres catégories.
std::overflow_errorDébordement mathématique survenu.
std::range_errorValeur hors plage pour l'opération.
std::underflow_errorSous-débordement mathématique survenu.

Exceptions définies par l'utilisateur

La classe de base std::exception peut être étendue pour créer des types d'erreur spécifiques au domaine. La redéfinition de what() fournit un message descriptif.

Exemple : Exception personnalisée

#include <iostream>
#include <exception>
using namespace std;
class NewException : public exception {
public:
    const char* what() const noexcept override {
        return "newException occurred";
    }
} newex;
int main() {
    try {
        throw newex;
    } catch (exception& ex) {
        cout << ex.what() << '\n';
    }
    return 0;
}

Sortie :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Voici une capture d'écran du code :

Maîtriser la gestion d exceptions en C++ : Exemples pratiques try, catch, throw

Décomposition du code :

  1. Dériver NewException de std::exception et redéfinir what().
  2. Instancier un objet newex à lever.
  3. Lever newex dans un bloc try.
  4. Intercepter par référence vers std::exception et afficher le message via what().

À retenir

Langue C

  1. Commentaires C++ : Bonnes pratiques pour un code lisible et maintenable
  2. Maîtriser la gestion d'exceptions Python : try, except, else et finally expliqués
  3. Maîtriser la gestion d'exceptions Java : try, catch, finally, throw et throws expliqués
  4. Maîtriser la gestion d'exceptions Java : try, catch, finally et ressources
  5. Maîtriser le switch-case en C++ : Syntaxe, utilisation et exemples pratiques
  6. Maîtriser l'allocation de tableaux dynamiques en C++ : Guide pratique avec exemples de code
  7. Les structures en C++ expliquées avec un exemple pratique
  8. Maîtriser std::list en C++ : Syntaxe, Fonctions et Exemples Pratiques
  9. Struct vs Class en C++ : Différences Clés, Syntaxe et Cas d'Utilisation Optimaux