执行投掷声明时会发生的例外情况

What will happen is an exception is thrown while executing a throw statement

本文关键字:情况 声明 执行      更新时间:2023-10-16

我有以下代码段:

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

假设MSGWIN32ERROR在上述代码段中为null,则在执行抛出语句时,它将依次有另一个例外。在这种情况下,行为是什么?

谢谢su

这里没有C 例外。

您正在混淆两件事:

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

后者有时也被混乱地称为"异常",但是您无法用C catch捕获这些。

会发生的是,msgWin32Error的解除将(可能)导致操作系统终止您的应用程序。控制甚至永远不会达到您的throw指令。

首先,当您放置空指针时,您会得到未定义的行为。抛出一个例外可能(因为引用UB的话,在允许行为的列表中抛出异常),但您不能指望这一点。但是,很容易构建一个定义明确的示例,该示例得到了我认为您的要求。

char const* foo()
{
    throw ExceptionZ();
    return "message";
}
void bar()
{
    try
    {
        throw ExceptionX(foo());
    }
    catch(ExceptionX) { ... }
    catch(ExceptionZ) { ... }
}

在这种情况下,将输入ExceptionZ的处理程序。bar中的投掷语句未完成。从 foo()抛出的例外是在它传播之前。

相关文章: