Le mécanisme des exceptions en C++

Le mécanisme d'exécution des exceptions en C++.

Exception dans un constructeur

/*
 * ExceptionClasse.h
 *
 *  Créé le: 2 janvier 2018
 *      Auteur: developpeur
 */

#ifndef EXCEPTIONCLASSE_H_
#define EXCEPTIONCLASSE_H_

#include <iostream>

using std::cout;
using std::endl;

class ExceptionClasse {
public:
    ExceptionClasse(){
        cout<<"ExceptionClasse"<<endl;
        throw int(42);
    }
    void demarrer(){
    }

    virtual ~ExceptionClasse() {
        cout<<"~ExceptionClasse"<<endl;
    }
};

#endif /* EXCEPTIONCLASSE_H_ */

Voir le codeSi aucun bloc try-catch externe n'est présent, la sortie sera:

ExceptionClasse
terminate called after throwing an instance of 'int'

Si un bloc try-catch externe est présent:

ExceptionClasse
Attrapé

Exception dans la méthode demarrer()

/*
 * ExceptionClasse.h
 *
 *  Créé le: 2 janvier 2018
 *      Auteur: developpeur
 */

#ifndef EXCEPTIONCLASSE_H_
#define EXCEPTIONCLASSE_H_

#include <iostream>

using std::cout;
using std::endl;

class ExceptionClasse {
public:
    ExceptionClasse(){
        cout<<"ExceptionClasse"<<endl;
    }
    void demarrer(){
        throw int(42);
    }

    virtual ~ExceptionClasse() {
        cout<<"~ExceptionClasse"<<endl;
    }
};

#endif /* EXCEPTIONCLASSE_H_ */

Voir le codeSi aucun bloc try-catch externe n'est présent:

ExceptionClasse

terminate called after throwing an instance of 'int'

Si un bloc try-catch externe est présent:

ExceptionClasse
~ExceptionClasse
Attrapé

Par conséquent, si une exception est levée dans un constructeur, le destructeur ne sera pas appelé. Si une exception est levée dans une autre méthode, le destructeur sera appelé.

De plus, si aucun bloc try-catch externe n'est présent, le destructeur n'est pas appelé, ce qui indique que C++, après avoir levé une exception, effectue d'abord un retour (probablement un retour de pile) et que le destructeur n'est appelé que lorsque l'exception est interceptée.

J'ai testé avec un bloc try-catch mais en changeant le type d'interception en float, et le destructeur n'est pas appelé non plus.

Le mécanisme des exceptions comporte plusieurs points importants à considérer. Durant mon apprentissage, j'ai consulté de nombreux articles utiles.

Traiteemnt des exceptions en C++ : abort(), mécanisme des exceptions, classe exception (c'est ainsi que j'ai commencé à découvrir le sujet)

C++ exceptions - Partie 1 : Explications complètes (ceci offre le plus de profondeur avec de nombreux points importants)

Gestion des exceptions en C++ : try, catch, throw

J'ai vu sur Zhihu quelques avis sur la difficulté d'utilisation des exceptions en C++, et je me demande comment vous gérez les erreurs en C++ ? (beaucoup de conseils d'experts, que je dois continuer à approfondir)

Compréhension approfondie des exceptions en C++ (semble offrir des explications détaillées, mais je ne les ai pas examinées en détail)

Gestion personnalisée des exceptions en C++ (en réalité, peu utile, mais au début je ne comprenais pas ce qu'était le mécanisme des exceptions et je pensais qu'il fallait des normes spécifiques)

Exceptions dans la bibliothèque standard de C++ (j'ai testé sous Linux avec logic_error, segfault, et j'ai confirmé que l'erreur se produit lors de la construction de logic_error, sans trouver la cause directement, j'ai donc hérité d'exception pour créer une classe personnalisée)

Étiquettes: C++ exceptions gestion d'erreurs constructeurs destructeurs

Publié le 2 juin à 21h26