可恢复的例外情况

时间:2013-09-19 08:14:27

标签: c++ visual-c++

我只是问一个普遍的问题,这是出于好奇心,当我在一个库项目中工作时,在另一个方法中抛出异常的返回值,但我想将该异常转换为返回值。我使用多个try catch块解决了它,但只是想知道在抛出异常后C ++中是否有一种方法可以恢复。

3 个答案:

答案 0 :(得分:5)

我不完全确定你想要什么。转换例外 在异常之后,返回代码 not 恢复。该 C ++委员会考虑恢复,但目前尚不清楚这是什么 也许意味着。考虑:

int
someFunction()
{
    // ...
    if ( someCondition ) {
        throw SomeException();
    }
    assert( !someCondition );
    // ...
}

在C ++中,assert永远不会触发(而且不会触发) 通常写它,因为ifthrow表明了它 声明的条件在之后有效)。如果你可以 恢复异常,assert会(或至少可能) 触发;你放弃了一种重要的代码验证方法。

同样以其他语言使用它的人报告了这一点 实际上并没有很好地运作,并且在每种情况下都是如此 开始使用恢复,他们不得不改变代码 以后再用

答案 1 :(得分:2)

没有。实际上,在抛出异常之后,编译器甚至可能不会发出无法访问代码的指令:

throw std::invalid_argument;
int i = 5; // No instructions generated for this, as it is unreachable.

答案 2 :(得分:0)

要使resume指令安全有效,它应该不仅在throw之后,而是在它之前的if之前跳转,以便重新测试条件

问题在于,通过构思C ++异常的方式,它们本身就是语句,并不一定是直接条件分支。 (ifthrow彼此独立定义)

此外,在throwcatch之间(可能是外面的几个函数调用),有一个名为“ stack展开”的东西实际上调用了所有的析构函数当地的一切都留在必须逃出的街区。 “resume”应该重建所有这些对象,但由于这些析构函数的动作不依赖于throw指令本身,并且可能不是“可逆的”,因此几乎不可能一致地恢复系统状态。 / p>

可能的习语是

for(;;)
{
   try
   {
     ... everything may throw ...
     break; //if you are here everything was successful, so stop looping and go on
   }
   catch(whatever_you_may)
   { 
      try_to_repair;
      if(impossible) throw;
   }
}

几乎你循环,直到你成功或决定它不再是这种情况。

但请注意这是一次重新执行,而不是重建(或不破坏)