嵌套的try-catch块?

时间:2011-11-23 05:59:04

标签: c++ exception try-catch

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,然后是一般异常,但在第二种情况下,我两次抛出一般异常。节目是否混淆了去哪个捕获?

2 个答案:

答案 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),

因此,您的第二个示例中的行为在标准中已明确定义。