什么是"扔"; 在一个拦截区外吗?

Tob*_*ner 20 c++

我只是偶然发现了这段代码:

void somefunction()
{
   throw;
}
Run Code Online (Sandbox Code Playgroud)

我想知道:这是什么意思?


我将问题标记为C++和Visual C++,因为我不知道答案.答案可能与标准或特殊的Visual C++扩展或忽略标准的Visual C++有关.这就是为什么我认为这两个标签都是合理的.

Jer*_*fin 30

当然,它可能somefunction()只是从某个catch块内部调用(猜测,这可能是意图).

如果throw;在异常未激活时执行,则调用throw;(第15.1/8节).


小智 9

它重新抛出当前活动的异常.从catch-block中调用它(可能是间接的)是有意义的.这个:

#include <iostream>
using namespace std;

void f() {
    throw;
}

int main() {
    try {
        try {
            throw "foo";
        }
        catch( ... ) {
            f();
        }
    }
    catch( const char * s ) {
        cout << s << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

打印"foo".


AnT*_*AnT 5

对于throw"外部"或"内部"的概念,catch块是在运行时术语中定义的,而不是在您似乎假设的编译时术语中定义的.因此,如果在块的throw运行时上下文中执行的运行时期间catch,throw则按预期工作.否则,terminate()被称为.

实际上,如果你仔细看看如何在语言规范中定义C++异常,那么很多关于它们的东西都是在运行时术语中定义的.有时它甚至看起来像是非C++.