Предположим, у меня есть две функции DoTaskA
и DoTaskB
— обе способны генерировать TaskException
— с соответствующими им «откатами». " функции UndoTaskA
и UndoTaskB
. Какой шаблон лучше всего использовать, чтобы либо оба были успешными, либо оба терпели неудачу?
Лучшее, что у меня есть на данный момент, это
bool is_task_a_done = false,
is_task_b_done = false;
try {
DoTaskA();
is_task_a_done = true;
DoTaskB();
is_task_b_done = true;
} catch (TaskException &e) {
// Before rethrowing, undo any partial work.
if (is_task_b_done) {
UndoTaskB();
}
if (is_task_a_done) {
UndoTaskA();
}
throw;
}
Я знаю, что is_task_b_done
не нужен, но может быть полезен для демонстрации симметрии кода на случай, если позже мы добавим третью или четвертую задачу.
Не нравится этот код из-за вспомогательных логических переменных. Возможно, в новом C++11 есть что-то, о чем я не знаю, что может сделать это более красиво?