9 votes

Erreur lors de la capture de std::runtime_error en tant que std::exception

Nous avons un problème amusant avec try catch et std::runtime_error. Quelqu'un peut-il m'expliquer pourquoi cela renvoie "Erreur inconnue" en sortie ? Merci beaucoup pour votre aide !

#include "stdafx.h"
#include 
#include 

int magicCode()
{
    throw std::runtime_error("ErreurAmusante");
}

int funnyCatch()
{
    try{
        magicCode();
    } catch (std::exception& e) {
        throw e;
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        funnyCatch();
    }
    catch (std::exception& e)
    {
        std::cout << e.what();
    }
 return 0;
}

24voto

Charles Bailey Points 244082

Le problème se situe avec cette ligne. Parce que throw avec une expression utilise le type statique de cette expression pour déterminer l'exception lancée, cela découpe l'objet d'exception en construisant un nouvel objet std::exception en copiant uniquement la partie base de l'objet std::runtime_error auquel e fait référence.

throw e;

Pour relancer l'exception attrapée, vous devriez toujours utiliser throw sans expression.

throw;

1voto

umlimo Points 41

J'ai trouvé une réponse parfaite à ce problème :

C++ fait une distinction explicite entre la référence et la copie de valeur. Utilisez

catch (const std::exception& e) 

pour attraper par référence au lieu de valeur.

Allez donner des votes positifs au répondant original ici

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