强大的异常保证VS基本异常保证

时间:2012-08-27 07:04:35

标签: c++ exception exception-handling

Abrahams我们有三种类型的例外:

  1. Nothrow
  2. 基本例外保证
  3. 强烈的例外保证
  4. 基本意味着(请纠正我,如果我错了)保留不变量,例如保留组件的不变量,并且没有资源泄露,其中操作具有强要么成功完成,要么抛出异常,使程序状态与操作开始前完全一致。

    1. 保留不变量是什么意思?如果我的一个变量中有一个有效值,那么它不会(例如一个指针)持有NULL

    2. 参考强异常保证,是否意味着在抛出异常之前我的所有变量都会存储完全相同的值?

    3. 例如:

      int main()
      
      {
          int j = 1;
          int *p = &j;
      
          // do some stuff
          j = 2;
          throw 1;
      
      }
      

      然后在我抛出后,j会保留值21

      此致

2 个答案:

答案 0 :(得分:9)

  1. 基本保证:抛出异常后,对象将保持一致,可用的状态。没有资源泄露,invariants被保留。对象的状态可能已更改,但仍可使用。例如,day值已变为-1的日期对象不再可用,因为其不变量表示day在[1,31]范围内。

  2. 强保证(除1之外):日期对象的值为2012-12-31。尝试修改该值失败的操作后,该对象的值仍为2012-12-31。也许一些内部状态已经改变,但从客户的角度来看逻辑状态没有改变。

答案 1 :(得分:4)

在您的情况下,没有例外保证。 (这基本上是案例0)。您引用的维基百科文章很清楚:“规则​​适用于类实现”。此外,抛出后,变量j超出范围且不再存在。你甚至不能再谈论它的地址,更不用说价值了

通常,类不变量是由类作者定义的,因此它意味着类作者的意思。我不明白你的观点1. NULL是指针的有效值。

你的第二点是好的。定义不是绝对的。例如,对字符串数据成员的操作可以增加其容量。你可以通过const&在外面观察到这一点。然而,该字符串容量通常不被视为字符串值的一部分,因此不作为类不变量的一部分。