Fondamentalement ceci:
void func() throw(std::exception,B) { /* Do Stuff */}
Est-ce que la sténographie vient ceci:
void func()
{
try
{
/* Do Stuff */
}
catch(std::exception const& e)
{
throw;
}
catch(B const& e)
{
throw;
}
catch(...)
{
unexpected(); // This calls terminate
// i.e. It never returns.
}
}
appel résiliez() est rarement ce que vous voulez, que la pile ne dévidé et donc tous vos efforts en RAII est gâché.La seule exception à la règle est la déclaration d'une liste de lancements vides et ceci est principalement à des fins de documentation pour montrer que vous soutenez la garantie d'exception sans lancer (vous devriez toujours attraper manuellement toutes les exceptions dans cette situation).
Certains endroits importants (imho) qui devraient être non-throw sont des destructeurs et des méthodes swap(). Les destructeurs sont rarement marqués explicitement no-throw mais swap() sont souvent marqués no-throw.
void myNoThrowFunc() throws() // No-Throw (Mainlly for doc purposes).
{
try
{
/* Do Stuff */
}
catch(...) // Make sure it does not throw.
{
/* Log and/or do cleanup */
}
}
Une des choses en C++ que j'ai appris, mais jamais utilisé, ni je :) – AraK
« ne prennent pas la peine avec les spécifications d'exception. Même les experts ne prennent pas la peine. Ils ne font pas ce que la plupart des gens pensent, et vous ne voulez presque jamais ce qu'ils font réellement. Andrei Alexandrescu & Herb Sutter – KeatsPeeks
Autant que je respecte Sutter et Alexandrescu. Mais c'est un mauvais conseil. Juste parce qu'ils sont mauvais ne signifie pas que vous ne devriez pas les apprendre. Cela vous aidera à expliquer aux autres pourquoi ils sont mauvais et à vous faire comprendre pourquoi vous devriez les éviter. Non seulement appliquer une règle dogmatique est une bonne chose. –