我有以下代码段:
try
{
if(/*something is true*/)
{
throw Win32Error(msgWin32Error->GetError()); //assume msgWin32Error is NULL
}
}
catch (Win32Error& win32Error)
{
}
假设上面的代码片段中msgWin32Error为NULL,当执行throw语句时,它将依次有另一个异常。在这种情况下会有什么样的行为?
谢谢, 苏
答案 0 :(得分:4)
这里没有C ++例外。
你正在混淆两件事:
throw
,try
,catch
)后者有时也会被混淆地称为“例外”,但你无法用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()
抛出的异常在它可以传播之前传播。