int main ()
{
try
{
try
{
throw 5;
}
catch (int n)
{
throw;
}
}
catch (...)
{
cout << "Exception occurred";
}
}
这打印出“Exception Ocured”但
int main ()
{
try
{
try
{
throw;
}
catch (...)
{
throw;
}
}
catch (...)
{
cout << "Exception occurred";
}
}
这只是错误。看起来我正在尝试捕捉完全一样!唯一的区别是,在第一种情况下我抛出一个int,然后是一般异常,但在第二种情况下,我两次抛出一般异常。节目是否混淆了去哪个捕获?
答案 0 :(得分:9)
没有&#34;一般例外&#34;你不扔东西。
在第一个示例中,您抛出int
,然后重新抛出您正在处理的异常。这是throw
没有争论的意思。
在第二个示例中,您将尝试重新抛出正在处理的异常。由于您当时没有处理异常,因此会出现错误。
答案 1 :(得分:3)
您的第二个示例使用良好的错误消息终止程序(至少使用g ++ 4.6.1):
terminate called without an active exception
Aborted
这是因为您尝试重新抛出异常,但由于没有活动异常,程序将终止。
当前的c ++ 11草案,在第15.5.1节中说明了这一点:
在某些情况下,必须放弃异常处理 微妙的错误处理技术。
然后在调用std::terminate
的案例列表中:
当没有操作数的throw-expression试图重新抛出一个 异常并没有处理异常(15.1),
因此,您的第二个示例中的行为在标准中已明确定义。