可恢复异常



我只是在问一个一般性问题,当我在处理其中一个库项目时出于好奇而出现的,在另一个方法中抛出返回值的异常,但我想将该异常转换为返回值。我使用多个 try catch 块解决了它,但只是想知道是否有办法在抛出异常后恢复C++。

我不完全确定你想要什么。 转换异常进入返回代码在异常后恢复。 这C++委员会考虑恢复,但不清楚那是什么可能意味着。 考虑:

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

在C++中,assert永远不会触发(也不会触发)。通常写它,因为ifthrow都很清楚断言的条件之后有效)。 如果可以的话恢复例外,assert会(或至少可能)触发;你会失去代码验证的重要手段。

用其他语言使用它的人也报告说它实际上效果不佳,而且在每种情况下,他们都会开始使用恢复,他们不得不将代码更改为 not以后再用。

No.事实上,在引发异常后,编译器甚至可能不会发出无法访问的代码指令:

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

要获得安全运行的resume指令,它不仅应该在throw之后跳跃,而且应该在它之前的if之前跳跃,以便重新测试条件。

这里的问题是,顺便说一下,C++例外被设想为它们本身就是陈述,不一定是直接条件分支。(ifthrow是独立定义的)

此外,在throwcatch之间(可能是外部的几个函数调用),有一个名为"堆栈展开"的东西,它实际上调用了所有本地内容的所有desctructors,这些都保留在必须转义的块中。一个"resume"应该重建所有这些对象,但是由于这些析构函数的动作不依赖于抛出指令本身,并且可能是不可逆的,所以几乎不可能始终如一地恢复系统状态。

可能的成语可以是

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;
   }
}
实际上,你

循环往复,直到你成功或决定不再如此。

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

最新更新