假設交易狀的圖案,我有兩個功能DoTaskA
和DoTaskB
—都能夠投擲TaskException
—及其相應的「回滾」功能UndoTaskA
和UndoTaskB
的。什麼是最好的使用模式,以使兩者都成功或兩者都失敗?C++的全有或全無工作
我最好現在
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中有一些我不知道的東西,它可以更好地編寫它?
如果你在catch塊內部,'is_task_b_done'總是'false' – SuperSaiyan
我知道,我已經添加了一個評論,說只有在代碼對稱的情況下才會添加第三或第四個任務。 – kirakun
您的應用程序是多線程的嗎?你有沒有看過[RAII](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)? – dirkgently