Il est recommandé que vous avez toujours quelque chose jettes dérivé de std::exception
et il y a quelques spécialisations prédéfinit telles que std::runtime_error
std exceptions invitant l'utilisation dangereuse?
l » interface std::exception
est donnée en termes de accesseurs non lanceuse. Génial. Maintenant, regardez le constructeur pour std::runtime_error
class runtime_error : public exception {
public:
explicit runtime_error (const string &);
};
Donc, si je cette
try {
foo();
}
catch (...) {
throw std :: runtime_error ("bang");
}
il est tout à fait possible que foo
jeté parce qu'il est hors de la mémoire, dans ce cas, la construction de l'argument string
à runtime_error
peut aussi jeter. Ce serait une expression qui jette aussi: cela n'appellera-t-il pas std::terminate
?
Est-ce que cela signifie que nous ne devrions toujours le faire à la place:
namespace {
const std :: string BANG ("bang");
}
...
try {
foo();
}
catch (...) {
throw std :: runtime_error (BANG);
}
MAIS ATTENDEZ cela ne fonctionnera pas non plus, il sera? Parce que runtime_error
va copier son argument, qui peut également lancer ...
... cela ne veut pas dire qu'il n'y a pas de façon sûre d'utiliser les spécialisations standard de std::exception
, et que vous devriez toujours rouler votre propre classe de chaînes dont le constructeur échoue seulement sans lancer?
Ou y at-il un truc qui me manque?
Utilisez une implémentation de bibliothèque standard avec une optimisation de petite chaîne (sans allocation) et des messages d'erreur très courts? – UncleBens