会发生什么是执行throw语句时抛出异常

时间:2015-05-04 20:55:07

标签: c++

我有以下代码段:

try
{
    if(/*something is true*/)
    {  
       throw Win32Error(msgWin32Error->GetError()); //assume msgWin32Error is NULL
    }
}
catch (Win32Error& win32Error)
{

}

假设上面的代码片段中msgWin32Error为NULL,当执行throw语句时,它将依次有另一个异常。在这种情况下会有什么样的行为?

谢谢, 苏

2 个答案:

答案 0 :(得分:4)

这里没有C ++例外。

你正在混淆两件事:

  • C ++例外(请参阅:throwtrycatch
  • 操作系统调用的运行时错误(例如分段错误)

后者有时也会被混淆地称为“例外”,但你无法用C ++ catch来捕捉它们。

将会发生msgWin32Error的取消引用(可能)会导致操作系统终止您的应用程序。控制权永远不会达到throw指令。

答案 1 :(得分:1)

首先,当您取消引用NULL指针时,会得到未定义的行为。可能会抛出 异常(因为如果调用UB,则抛出异常位于允许行为列表中),但您不能指望它。但是,构建一个定义良好的示例很容易实现我认为您所要求的内容。

char const* foo()
{
    throw ExceptionZ();
    return "message";
}

void bar()
{
    try
    {
        throw ExceptionX(foo());
    }
    catch(ExceptionX) { ... }
    catch(ExceptionZ) { ... }
}

在这种情况下,将输入ExceptionZ的处理程序。 bar中的throw语句未完成。从foo()抛出的异常在它可以传播之前传播。