Bad Re-throw编译但在运行时崩溃

Lea*_*ner 2 c++ exception

以下代码将编译但在运行时崩溃:

int main() {

    try {
        throw;
    }
    catch(...){
        cout<<"In catch";
    }
     return 0;

}
Run Code Online (Sandbox Code Playgroud)

结果:"hello.exe中0x7c812a5b处的未处理异常:Microsoft C++异常:[rethrow] @ 0x00000000"

为什么编译器允许代码编译?编译器检查此代码是否是catch块的一部分看起来不是那么困难.

小智 5

如果编译器编写者将足够的工作投入其中,那么编译器可能会捕获数百万个错误.但是那些编译器编写者必须判断这项工作是否值得.在这种情况下,他们决定不(我同意他们).


Tad*_*pec 5

来自C++标准(15.1.8)

如果当前没有处理异常,则执行不带操作数的throw-expression调用std :: terminate()

由于标准允许它并给出明确的语义,编译器只能符合它.

  • 问题是"为什么编译器允许代码编译?" 它必须.其他人给出了在单独函数中重新抛出可能有用的示例.并且创建用于检查主要功能的特殊规则,知道它不能被调用,是为了获得太少的收益. (2认同)