Exceptions questions sur rethrow d'exception d'origine C +
Question
Est-ce que d'être appelé l'append suivante () dans la prise provoquer l'exception relancée pour voir l'effet de append ()?
try {
mayThrowMyErr();
} catch (myErr &err) {
err.append("Add to my message here");
throw; // Does the rethrow exception reflect the call to append()?
}
De même, si je réécris cette façon, va trancher peu se produire si l'exception réelle est dérivée par MyErr?
try {
mayThrowObjectDerivedFromMyErr();
} catch (myErr &err) {
err.append("Add to my message's base class here");
throw err; // Do I lose the derived class exception and only get myErr?
}
La solution
Autres conseils
Cette question est assez ancienne et a une réponse appropriée au moment où il a été demandé. Cependant, je veux juste ajouter une note sur la façon de faire la gestion des exceptions appropriée depuis C 11 ++ et je crois que cela correspond très bien à ce que vous essayez d'atteindre avec votre fonction append:
std::nested_exception
et std::throw_with_nested
Il est décrit sur StackOverflow et ici , comment vous pouvez obtenir une trace sur vos exceptions dans votre code sans besoin d'un débogueur ou l'exploitation forestière lourde, en écrivant simplement un gestionnaire d'exception appropriée qui réémettre exceptions imbriquées .
Comme vous pouvez le faire avec une classe d'exception dérivée, vous pouvez ajouter beaucoup d'informations à un tel backtrace! Vous pouvez également jeter un oeil à mon MWE sur GitHub, où un backtrace ressemblerait à quelque chose comme ceci:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
Oui, rethrowing rethrows l'objet d'exception d'origine, que vous avez modifié par une référence. Vous pouvez également prendre une référence de classe de base, modifier par et être encore capable de réémettre le type d'exception dérivée originale par throw;
.
pour la première question, oui.
mais pour la deuxième, se référer à la réponse Vlad. vous aurez besoin de concevoir soigneusement votre objet d'exception pour gérer copie cteur. par convention, classe de base ne reconnaît pas son enfant si vous perdrez très probablement les données supplémentaires effectuées par classe dérivée.