我刚刚偶然发现了这段代码:
void somefunction()
{
throw;
}
我想知道:这是什么意思?
我刚刚偶然发现了这段代码:
void somefunction()
{
throw;
}
我想知道:这是什么意思?
大概意思是 somefunction()
函数只能在某个 catch
块内部被调用。这种情况下,当执行throw;
时会有一个异常处于活动状态,此时当前异常会被重新抛出,以便由下一个可以处理该异常类型的外层处理程序来捕获。
如果在没有异常处于活动状态时执行 throw;
,则会调用 terminate()
(参见 N4810, §[expr.throw]/4)。
它重新抛出当前活动的异常。 只有在catch块中调用它(可能是间接调用)才有意义。 这样做:
#include <iostream>
using namespace std;
void f() {
throw;
}
int main() {
try {
try {
throw "foo";
}
catch( ... ) {
f();
}
}
catch( const char * s ) {
cout << s << endl;
}
}
打印 "foo"。
throw
,"外部"或"内部"catch块的概念是在运行时而不是编译时定义的,这一点请注意。因此,如果在运行时上下文中执行throw
,并且该上下文处于catch
块的运行时上下文中,则throw
将按预期工作。否则,将调用terminate()
。f()
可能正在执行的内容,我们可能会得到一个类似于我在this answer中提出的LogKnownException()
函数的实现。catch(...)
{
LogKnownException();
}
LogKnownException()
示例,但我希望它只允许不想记录的异常传播并继续以未处理的方式进行。