我可以在C ++中嵌套try-catch块吗?

时间:2009-02-16 14:57:24

标签: c++ exception nested

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


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

5 个答案:

答案 0 :(得分:22)

是完全合法的。

虽然最好将内部的方法转移到另一种方法中,以使它看起来更干净,而且你的方法更小

答案 1 :(得分:10)

如前所述,这是有可能的,但你必须看到这种“堕落”计划。如果在第一个try-catch-block中捕获了异常,它将不会被外部catch块捕获。但是,如果它没有被内部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;
}

将导致:

Inner Exception-Handler: Test
Outer Exception-Handler: Test

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

答案 2 :(得分:6)

是的,这是合法的。正如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块处理。在处理Exception类层次结构时,您必须以最特定的顺序对catch块进行排序。

答案 3 :(得分:1)

是的,你可以。

答案 4 :(得分:1)

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