Когда у меня есть метод, который вызывает набор методов, которые предлагают сильную гарантию, у меня часто возникает проблема с откатом изменений, чтобы также иметь метод сильной гарантии. Давайте использовать пример:
// 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
}
Очевидно, что UnsetMethod может бросить. В этом случае мой MacroMathod () предлагает только базовую гарантию. Тем не менее, я сделал все, что мог, чтобы предложить надежную гарантию, но я не могу быть абсолютно уверен, что мой UnsetMethod () не сработает. Вот мои вопросы:
- Стоит ли даже пытаться предложить надежную гарантию в этом случае?
- Должен ли я документировать свой MacroMethod () как имеющий базовую или надежную гарантию? Даже если это очень маловероятно, UnsetMethod выбросит?
- Можете ли вы найти способ сделать этот метод действительно надежной гарантией?
- Вероятно, мне следует попытаться выполнить вызов UnsetMethod (), но это довольно тяжело, и что мне делать в улове?
Спасибо!