Erreur à la chasse de std::runtime_error comme std::exception
nous avons un drôle de problème avec try catch et std::runtime_error.
Quelqu'un peut m'expliquer pourquoi c'est le retour "erreur Inconnue" comme sortie ?
Merci beaucoup de m'aider !
#include "stdafx.h"
#include <iostream>
#include <stdexcept>
int magicCode()
{
throw std::runtime_error("FunnyError");
}
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;
}
- Il imprime "FunnyError" pour moi, à l'aide de Visual C++ 2010. Le compilateur que vous utilisez?
- Visual Studio 2005
Vous devez vous connecter pour publier un commentaire.
Le problème est avec cette ligne. Parce que
throw
avec une expression utilise le type statique de l'expression, afin de déterminer l'exception levée, c'tranches de l'objet de l'exception de la construction d'une nouvellestd::exception
objet de copie de l'objet de base de la partie de lastd::runtime_error
quee
est une référence à.De re-jeter l'exception interceptée vous devriez toujours utiliser les jeter sans expression.
exception
s'constructeur de copie n'a pas à préserverwhat()
. Je ne savais pas que.std::exception
s'constructeur de copie. Non, ce ne sera pas nécessairement lieu à une "bonne" copie de l'exception, commestd::exception
est seulement la classe de base de l'exception quie
désigne en fait.what()
sur un copié exception est mise en œuvre définies. En Mars (N3090), leexception
constructeur de copie doit veiller à ce questrcmp(this->what(), rhs.what()) == 0
après la copie d'unrhs
avec dynamique type deexception
. Il est donc garanti à imprimer "FunnyError" dans C++0x comme l'a écrit.J'ai trouvé une parfaite réponse à ce problème:
Aller donner upvotes pour l'original répondeur ici