-1

在编写异常安全代码时,所有私有成员函数是否应该至少保证基本的异常安全?在这种情况下,最佳/最佳做法是什么?备择方案?

例如,假设我有一个Foo带有publicfunction member的类DoSomething,它调用privatefunction member DoSomeOfItDoSomeOfIt可能由于某些我无法影响的功能而失败,并且当它发生时,它可能会使Foo对象处于部分修改状态,这违反了Foo的不变量。所以我可以包装DoSomeOfIt在一个块中并调用块中的try-catch另一个private函数成员来撤消所做的事情。单独地,可能不是异常安全的,但确实如此。那会是异常安全代码吗?(在这种情况下有强有力的保证)UndoThatcatchDoSomeOfItDoSomeOfItUndoThatDoSomething

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.
  }
};

当然,我可以简单地包含DoSomeOfItUndoThatin的代码DoSomething,但这可能会导致代码膨胀和函数体过长,而分解函数会使任务模块化并可能使代码更具可读性(?)

免责声明:我理解这可能是基于意见的。我不确定这是否会使这篇文章变得糟糕,但我会很感激任何意见或经验,这会导致问题,或者是常见的做法等。

4

1 回答 1

1

这是我的意见。

如果有可能DoSomeOfIt被多个函数使用,最好让异常处理代码驻留在该函数本身中——您不希望异常处理代码在多个函数之间重复。如果这不可能,那么您发布的代码就可以了。

话虽如此,如果将异常处理代码移至DoSomething,则不会丢失任何内容。事实上,功能变得更好。如果它将来被另一个函数使用,则已经处理了异常处理。从这个角度来看,将异常处理代码移到DoSomething.

于 2020-07-20T18:24:49.130 回答