2010-07-23 3 views
4

Par exemple, dans le code suivant:Que se passe-t-il lorsqu'une exception est levée lors du déroulement de la pile d'une autre exception?

#include <iostream> 
using namespace std; 
class A { 
    public: 
      A() { cout << "A::A()" << endl; } 
      ~A() { cout << "A::~A()" << endl; throw "A::exception"; } 
    }; 
class B { 
    public: 
      B() { cout << "B::B()" << endl; throw "B::exception"; } 
      ~B() { cout << "B::~B()"; } 
    }; 
int main(int, char**) 
{ 
    try { 
      cout << "Entering try...catch block" << endl; 
      A objectA; 
      B objectB; 
      cout << "Exiting try...catch block" << endl; 
    } 
    catch (char* ex) { 
      cout << ex << endl; 
    } 
    return 0; 
} 

B 's destructor déclenche une exception, qui appelle A' destructor s tandis que le déroulement de la pile, ce qui entraîne la remise d'une autre exception. Quelle sera la réaction du programme?

+0

double: http://stackoverflow.com/questions/130117/throwing-exceptions-out-of- un-destructeur –

Répondre

6

Réponse courte? Bang, fin de l'application.

De parashift:

Au cours de la pile de déroulement, tous les objets locaux dans tous les cadres de la pile sont DESTRUCTED. Si l'un de ces Destructeurs jette une exception (disons qu'il jette un objet de la barre), le système d'exécution C++ est dans une situation inextricable: faut-il ignorer la barre et finissent dans le

} catch (Foo e) { 

où il était à l'origine à tête? Devrait-il ignorer le Foo et chercher un

} catch (Bar e) { 

gestionnaire? Il n'y a pas de bonne réponse - soit le choix perd de l'information.

Donc le langage C++ garantit qu'il appellera terminate() à ce stade, et terminate() tue le processus. Bang tu es mort.

Questions connexes sur Stack Overflow:

Questions connexes