在编写异常安全代码时,所有私有成员函数是否应该至少保证基本的异常安全?在这种情况下,最佳/最佳做法是什么?备择方案?
例如,假设我有一个Foo
带有public
function member的类DoSomething
,它调用private
function member DoSomeOfIt
。DoSomeOfIt
可能由于某些我无法影响的功能而失败,并且当它发生时,它可能会使Foo
对象处于部分修改状态,这违反了Foo
的不变量。所以我可以包装DoSomeOfIt
在一个块中并调用块中的try-catch
另一个private
函数成员来撤消所做的事情。单独地,可能不是异常安全的,但确实如此。那会是异常安全代码吗?(在这种情况下有强有力的保证)UndoThat
catch
DoSomeOfIt
DoSomeOfIt
UndoThat
DoSomething
class Foo {
public:
// I provide strong exception safety guarantee
void DoSomething() {
try {
DoSomeOfIt();
} catch (const std::exception& e) {
UndoThat();
throw;
}
}
private:
// I provide no exception safety guarantee.
DoSomeOfIt() {
// may throw and violate class invariants.
}
// I provide no exception safety guarantee.
UndoThat() {
// undoes everything most recent call of
// DoSomeOfIt did.
}
};
当然,我可以简单地包含DoSomeOfIt
和UndoThat
in的代码DoSomething
,但这可能会导致代码膨胀和函数体过长,而分解函数会使任务模块化并可能使代码更具可读性(?)
免责声明:我理解这可能是基于意见的。我不确定这是否会使这篇文章变得糟糕,但我会很感激任何意见或经验,这会导致问题,或者是常见的做法等。