Lorsque j'ai une méthode qui appelle un ensemble de méthodes offrant une forte garantie, j'ai souvent des problèmes pour annuler les modifications afin d'avoir également une méthode de garantie solide. Utilisons un exemple:Méthode de garantie forte faisant appel à des méthodes de garantie fortes
// Would like this to offer strong guarantee
void MacroMethod() throw(...)
{
int i = 0;
try
{
for(i = 0; i < 100; ++i)
SetMethod(i); // this might throw
}
catch(const std::exception& _e)
{
// Undo changes that were done
for(int j = i; j >= 0; --j)
UnsetMethod(j); // this might throw
throw;
}
}
// Offers strong guarantee
void SetMethod(int i) throw(...)
{
// Does a change on member i
}
// Offers strong guarantee
void UnsetMethod() throw(...)
{
// Undoes a change on member i
}
Évidemment, le UnsetMethod pourrait lancer. Dans ce cas, mon MacroMathod() offre uniquement une garantie de base. Pourtant, j'ai fait tout ce que je pouvais pour offrir une garantie solide, mais je ne peux pas être absolument sûr que mon UnsetMethod() ne jettera pas. Voici mes questions:
- Dois-je même essayer d'offrir une forte garantie dans ce cas?
- Dois-je documenter mon MacroMethod() comme ayant une garantie basique ou forte? Même si c'est très improbable que UnsetMethod va lancer?
- Pouvez-vous voir un moyen de faire de cette méthode une véritable garantie?
- Je devrais probablement mettre l'appel à UnsetMethod() dans un essai, mais cela semble plutôt lourd, et que dois-je faire dans le catch?
Merci!
Je ne l'ai vu la forte garantie été appliquée aux méthodes non fonctions autoportants. Je suppose que cela peut être fait mais nous avons vraiment besoin de mieux comprendre le contexte. Changer le membre i sur quoi exactement existe-t-il une variable globale sur laquelle nous changeons l'état? Si c'est un objet. Ensuite, vous faites une copie. Préformez les opérations si elles fonctionnent toutes, puis échangez avec la vraie. –
Comme une note de style (avec des implications assez désagréables), vous devriez reconsidérer en utilisant des spécifications d'exception. Ils ont été connus pour causer de sérieux problèmes au point d'essayer de les supprimer complètement de la langue. –
@Stanley: A eu une discussion avec un ami à ce sujet. J'ai aussi testé avec le compilateur, et lu le boost rationnel. Tu as raison. Je pensais que cette critique/limitation consistait à spécifier des types dans la spécification, pas la spécification tout à fait. Ce qui explique pourquoi je l'ai gardé pour lancer() vs lancer (...). Merci pour le commentaire et mettra à jour mon code. – Geeho