c++ - 如果 throw 会发生什么;语句在 catch block 之外执行?

标签 c++ exception visual-c++ exception-handling

在 C++ 中,throw; 在 catch block 内执行时会将当前捕获的异常重新抛出 block 外。

this answer当经常使用复杂的异常处理时,异常调度器的想法被提出来作为减少代码重复的解决方案:

try {
    CodeThatMightThrow();
} catch(...) {
    ExceptionHandler();
}

void ExceptionHandler()
{
    try {
        throw;
    } catch( FileException* e ) {
        //do handling with some complex logic
        delete e;
    } catch( GenericException* e ) {
        //do handling with other complex logic
        delete e;
    }
}

抛出一个指针或一个值没有任何区别,所以这是不可能的。

如果不是从 catch block 调用 ExceptionHandler() 会发生什么?

我用 VC7 试过这段代码:

int main( int, char** )
{   
    try {
        throw;
    } catch( ... ) {
        MessageBox( 0, "", "", 0 );
    }
    return 0;
 }

首先它使调试器指示第一次机会异常,然后立即指示未处理的异常。如果我在调试器之外运行此代码,程序崩溃的方式与调用 abort() 的方式相同。

这种情况下的预期行为是什么?

最佳答案

来自标准,15.1/8

If no exception is presently being handled, executing a throw-expression with no operand calls std::terminate().

关于c++ - 如果 throw 会发生什么;语句在 catch block 之外执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/981400/

相关文章:

c++ - 如何跳过空格而不是换行符

无法解决使用 C 中函数的指针返回数组的错误?

c++ - 在我的小部件应用程序中的 qt mainwindow.ui 窗口中打印文本

c++ for循环后自增前自增差

c++ - 如何为参数包的第一个参数创建 typedef

c# - 回避异常和 "a function evaluation has timed out"

ruby-on-rails - Rails 4 - 如果出错,异常通知程序不会发送电子邮件

c# - 使用线程池对后台线程进行异常处理

visual-studio-2010 - 在 VS2010 中,VC++ 错误 LNK 2019 with CoolProp 5.0.0

c++ - 未在 lambda 内部调用显式运算符 bool — MSVC 错误?