【问题标题】:What happens if a throw; statement is executed outside of catch block?如果投掷会发生什么;语句在 catch 块之外执行?
【发布时间】:2010-11-02 03:45:48
【问题描述】:

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

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 块调用 ExceptionHandler() 会发生什么?

我用 VC7 试过这段代码:

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

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

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

【问题讨论】:

  • 删除了“windows”标签,因为这与 Windows 无关(但这是一个好问题)。

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


【解决方案1】:

来自标准,15.1/8

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

【讨论】:

  • 仅仅因为 a) 你打败了我,b) 你引用了标准,我将删除我的(几乎)重复的答案
猜你喜欢
  • 2011-01-18
  • 2011-02-11
  • 2017-10-16
  • 1970-01-01
  • 2020-01-04
  • 2014-04-04
  • 2020-04-29
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多