當我有一個方法調用一組提供強保函的方法時,我也經常遇到回滾更改的問題以便也有一個強有力的保證方法。我們用一個例子:調用強保證方法的強保證方法
// 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()函數,但感覺相當沉重,我該怎麼做呢?
謝謝!
我只看到了強有力的保障被應用到方法不是獨立的功能。我認爲它可以完成,但我們真的需要更多地瞭解上下文。更改成員我什麼是有什麼全局變量我們正在改變狀態?如果它是一個對象。然後你複製一份。如果他們都工作,然後與真正的交換,那麼執行操作。 – 2010-09-20 14:52:03
作爲樣式註釋(帶有一些非常討厭的含義),您應該重新考慮使用異常規範。他們已經知道會導致嚴重的問題,試圖將它們從語言中徹底刪除。 – 2010-09-20 14:58:03
@Stanley:與朋友討論過這件事。編譯器也做了一些測試,並閱讀了boost的理性。你是對的。我雖然這種批評/限制是指定規範中的類型,而不是完全規範。這就解釋了爲什麼我保持拋出()與拋出(...)。感謝您的評論,並會更新我的代碼。 – Geeho 2010-09-24 01:16:04