Création d'exceptions personnalisées en C ++
Je suis en train d'apprendre le C++, et je suis en train de vivre lorsque j'essaie de créer ma propre exception et de les jeter sur Linux.
J'ai créé un petit projet de test pour tester mon application et ci-dessous est ma classe d'exception fichier d'en-tête.
class TestClass : public std::runtime_error
{
public:
TestClass(char const* const message) throw();
virtual char const* what() const throw();
};
Le fichier source de la classe exception est
using namespace std;
TestClass::TestClass(char const* const message) throw()
: std::runtime_error(message)
{
}
char const * TestClass::what() const throw()
{
return exception::what();
}
Dans mon application principale, je vais appeler une fonction qui jette mon exception et l'attrape dans un try/catch comme suit:
void runAFunctionAndthrow();
/*
*
*/
int main(int argc, char** argv) {
try
{
cout << "About to call function" << endl;
runAFunctionAndthrow();
}
catch (TestClass ex)
{
cout << "Exception Caught: " << ex.what() << endl;
}
return 0;
}
void runAFunctionAndthrow()
{
cout << "going to run now. oh dear I need to throw an exception" << endl;
stringstream logstream;
logstream << "This is my exception error. :(";
throw TestClass(logstream.str().c_str());
}
Lorsque je cours, je m'attends à obtenir la sortie suivante:
Sur le point d'appeler la fonction
Va exécuter maintenant. oh j'ai besoin de lancer une exception
Exception Interceptée: C'est mon erreur d'exception. 🙁
Au lieu de ce que je reçois est
Sur le point d'appeler la fonction
va exécuter maintenant. oh j'ai besoin de lancer une exception
Exception Interceptée: std::exception
Avis la dernière ligne il est dit std::exception au lieu de mon message d'exception "Ceci est mon erreur d'exception".
Pourquoi est-ce, cela fonctionne bien sur Windows, mais sous Linux il le fait.
De ce que j'ai vu sur différents postes de ce que j'ai fait est correct donc ce qui me manque.
source d'informationauteur Boardy
Vous devez vous connecter pour publier un commentaire.
Votre
what()
retourne:La valeur de retour de
std::exception::what()
est spécifié comme suit:Que c'est. Rien de plus, rien d'autre. Le texte que vous nous présentez qualifie certainement comme une "informations explicatives". Et c'est la seule condition pour la valeur de retour de
what()
(sauf pour un autre qui n'est pas pertinente ici).En d'autres termes, le C++ ne garantit pas le contenu exact de ce que vous obtenez avec
what()
.what()
que vous voyez estwhat()
que vous obtenez, comme le dit le dicton.Si vous voulez que vos exception pour décrire lui-même, d'une certaine façon, c'est à vous de les mettre en œuvre, dans le cadre de votre
what()
.Vous avez besoin de votre propre mise en œuvre de ce() la méthode ou l'utilisation
std::runtime_error::what()
comme écrit dans les commentairesDire:
Aussi, de mieux utiliser les
noexcept
au lieu dethrow()
et seulement après que vous lisez sur eux - lien.Et dans votre try-catch:
Au lieu de
catch(TestClass myException)
- sinon, vous ne implicite de l'exemplaire qui peut entraîner une exception jeter. Il rompt également le polymorphisme: si vous voulezcatch
pure virtual interface
mise en œuvre exemple, vous avez besoin d'utiliser une référence.Vous avez besoin d'un moyen de spécifier un message d'erreur personnalisé à std::exception qui autant que je sache, n'est pas autorisé. Voir cette pour une solution possible.