我只是在问一个一般性问题,当我在处理其中一个库项目时出于好奇而出现的,在另一个方法中抛出返回值的异常,但我想将该异常转换为返回值。我使用多个 try catch 块解决了它,但只是想知道是否有办法在抛出异常后恢复C++。
我不完全确定你想要什么。 转换异常进入返回代码在异常后不恢复。 这C++委员会考虑恢复,但不清楚那是什么可能意味着。 考虑:
int
someFunction()
{
// ...
if ( someCondition ) {
throw SomeException();
}
assert( !someCondition );
// ...
}
在C++中,assert
永远不会触发(也不会触发)。通常写它,因为if
和throw
都很清楚断言的条件之后有效)。 如果可以的话恢复例外,assert
会(或至少可能)触发;你会失去代码验证的重要手段。
用其他语言使用它的人也报告说它实际上效果不佳,而且在每种情况下,他们都会开始使用恢复,他们不得不将代码更改为 not以后再用。
No.事实上,在引发异常后,编译器甚至可能不会发出无法访问的代码指令:
throw std::invalid_argument;
int i = 5; // No instructions generated for this, as it is unreachable.
要获得安全运行的resume
指令,它不仅应该在throw
之后跳跃,而且应该在它之前的if
之前跳跃,以便重新测试条件。
这里的问题是,顺便说一下,C++例外被设想为它们本身就是陈述,不一定是直接条件分支。(if
和throw
是独立定义的)
此外,在throw
和catch
之间(可能是外部的几个函数调用),有一个名为"堆栈展开"的东西,它实际上调用了所有本地内容的所有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;
}
}
实际上,你循环往复,直到你成功或决定不再如此。
但请注意,这是重新执行,而不是重建(或未破坏)