23

我可以嵌套 try-catch 块吗?例如:


void f()
{
    try
    {
        //Some code 
        try
        {
             //Some code 
        }
        catch(ExceptionA a)
        {
            //Some specific exception handling
        }
        //Some code
    }
    catch(...)
    {
        //Some exception handling
    }
}//f
4

5 回答 5

27

是的,完全合法。

虽然最好将内部方法移到另一种方法中,这样它看起来更干净,而且您的方法更小

于 2009-02-16T15:01:27.550 回答
12

如前所述,这是可能的,但是您必须在其中看到“失败”方案。如果在第一个 try-catch-block 中捕获了您的异常,则它不会被外部 catch-block 捕获。但是,如果它没有被内部 catch 块捕获,它将尝试在外部 catch 块中找到匹配的异常处理程序。

您还可以通过throw;在内部异常处理程序中使用,将异常进一步明确地引发到下一个异常处理程序。

例如这段代码:

try
{
    try
    {
        throw std::runtime_error("Test");
    }
    catch (std::runtime_error& e)
    {
        std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
        throw;
    }
}
catch (std::exception& e)
{
    std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}

将导致:

内部异常处理程序:测试
外部异常处理程序:测试

这是有效的,因为std::runtime_error 派生自 std::exception。您还应该注意,在这样一个简单的示例中,也可以将 catch 块一个接一个地编写,但是如果您想在第一个 catch 块之后执行其他代码,则必须嵌套它们。

于 2009-02-16T15:09:06.860 回答
7

是的,这是合法的。正如ouster所说,处理它的一种方法是将内部 try-catch 块放在它自己的函数中,并从外部 try-catch 块中调用该函数。

另一种处理它的方法是使用多个 catch 块。

void f()
{
    try
    {
        //Some code that throws ExceptionA
        //Some code that throws ExceptionB
    }
    catch(ExceptionA ea)
    {
        //Some exception handling
    }
    catch(ExceptionB eb)
    {
        //Some exception handling
    }
}//f

这里要注意的是 catch 块中异常类型的特殊性。如果 ExceptionB 在上面的示例中扩展了 ExceptionA,那么 ExceptionB 块将永远不会被调用,因为任何被抛出的 ExceptionB 都将由 ExceptionA 块处理。在处理异常类层次结构时,您必须以最具体到最不具体的顺序对 catch 块进行排序。

于 2009-02-16T15:25:33.123 回答
1

是的你可以。

于 2009-02-16T15:00:25.197 回答
1

它是合法的,但除非你从你的内部 catch() 中抛出一个异常,否则它并不是那么有用。例如,您可能想要捕获系统级异常,但为了代码清晰而抛出您自己的异常对象。

于 2009-02-16T15:23:12.193 回答