29 votes

ex.what() change dans un try-catch imbriqué

J'ai un code try-catch imbriqué comme ci-dessous :

void A()
{
    try
    {
        //Code like A = string(NULL) that throws an exception
    }
    catch(std::exception& ex)
    {
        cout<<"in A : " << ex.what();
        throw ex;
    }
}

void B()
{
   try
   {
       A();
   }
   catch(std::exception& ex)
   {
       cout<<"in B : " << ex.what();
   }
}

Après avoir exécuté cette opération, j'ai obtenu ce résultat :

in A: basic_string::_M_construct null not valid
in B: std::exception

Comme vous pouvez le voir, ex.what() fonctionne bien dans la fonction A et me donne la description correcte, mais dans B ex.what() me dit juste std::exception . Pourquoi cela se produit-il ?

Est-ce que je lance quelque chose de différent ou de faux dans la clause catch de la fonction A ? Comment puis-je lancer une exception imbriquée afin d'obtenir la description exacte de l'exception dans B ?

41voto

Bathsheba Points 23209

Remplacer throw ex; con throw; .

Si vous faites cette dernière opération, l'exception sera rejetée. ex , par référence Il n'y a donc aucun risque à tenter d'en faire une copie de valeur. Qu'est-ce que le découpage en tranches d'objets ?

(Notez que vous sont autorisé à modifier ex même si vous écrivez throw ).

32voto

StoryTeller Points 6139

Vous lancez une copie de l'exception ex en A . Ce qui provoque un découpage de l'objet qui transforme l'exception concrète en std::exception .

Pour relancer l'exception réelle que vous avez capturée de manière polymorphe, utilisez la commande throw; déclaration.

Il est bon de garder à l'esprit ce que Scott Meyers dit dans son livre. Vous lancez par valeur, et devriez attraper par référence.

7voto

Marco A. Points 18535

Vous êtes coupe en tranches l'objet d'exception original, essayez avec

try {
  throw std::runtime_error("Hello world");
}
catch (std::exception& ex)
{
  cout << "in A : " << ex.what();
  throw; // Rethrows the original exception - no copy or slicing
  ^^^^^^
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X