Je suis bien conscient du fait qu'il ne faut pas lancer d'exception dans le destructeur.
Mais pour me faire une idée de ce concept, j'ai codé cet exemple :-.
#include <iostream>
using namespace std;
class A {
private:
int i;
public:
A()
{
i = 10;
}
~A()
{
throw 30;
}
};
int main(){
try{
A();
throw 10;
}
catch (int i){
cout << i << endl;
cout << "exception caught" << endl;
}
}
D'après ce que j'ai compris, ce programme devrait être terminé en appelant std::terminate() car il y aura deux exceptions en même temps. Mais, ce programme donne la sortie suivante : -.
30
exception caught
Quelqu'un peut-il m'expliquer la logique qui sous-tend cette situation et pourquoi elle ne se termine pas ?
13 votes
Pourquoi
throw 10;
est censé être exécuté ?3 votes
Impossible de reproduire G++ 5.1.0 : "terminate called after throwing an instance of 'int'" (terminaison appelée après avoir lancé une instance de 'int')
0 votes
Il est bon de savoir que vous ne devez pas lancer d'exception dans le destructeur, mais savez-vous pourquoi ?
0 votes
Ne peut pas être reproduit avec clang
0 votes
Impossible à reproduire ideone.com/7T91cF - est appelé après avoir lancé une instance de 'int'.
7 votes
Au fait,
<iostream.h>
n'existe pas dans le C++ standard.0 votes
Je suis bien conscient du fait qu'il ne faut pas lancer d'exception dans le destructeur. \=> il existe des raisons parfaitement légitimes de lancer un destructeur ; parfois, mettre fin au processus est la meilleure solution.