2010-04-30 3 views
0

//sample.hcode suivant comipling parfaitement mais montrant l'erreur d'exécution. Pourquoi?

int calci(int &value) 
{ 
    if(value < 20) 
    throw value; 
    else 
    return value; 
} 

class XYZ 
{ 
    int m_x; 
    public: XYZ(int &x)try:m_x(x-calci(x)) 
      { 
      }catch (int &a) 
      {} 

}; 
class ABC 
{ 
    int m_a; 
    public: ABC():m_a(0) 
    { 
    } 
    void foo() 
    { 
     XYZ xyz(10); 


    } 
}; 




int main() 
{ 
    ABC abc; 
    abc.foo(); 
} 

// si je remplace foo() avec le code suivant, alors il fonctionne bien

void foo() 
{ 
    try{ 
    XYZ xyz(10); 
    }catch(...){} 
} 
+0

son public: XYZ (int & x) essayer: m_x (x-Calci (x)) dans la ligne 11 – Suri

+0

s'il vous plaît répondre :( – Suri

+0

@ user323422 Fait;) –

Répondre

5

De: http://gotw.ca/gotw/066.htm

Ce qui est moins évident, mais clairement déclaré dans la norme, est que si le bloc catch ne jette pas (soit rethrow l'original eption, ou jeter quelque chose de nouveau), et le contrôle atteint la fin du bloc catch de un constructeur ou un destructeur, alors l'exception originale est automatiquement repoussée .

Du standard 15,3/16

L'exception est manipulé relancée si la commande atteint la fin de un gestionnaire de la fonction-try-bloc de un constructeur ou destructeur. Sinon, une fonction renvoie lorsque le contrôle atteint la fin d'un gestionnaire pour le bloc fonction-try (6.6.3). L'effacement d'un bloc try-try équivaut à un retour sans valeur; il en résulte un comportement non défini dans une fonction de retour de valeur (6.6.3).

Questions connexes