catch块中抛出的异常会被后来的catch块捕获吗?

时间:2011-08-06 14:17:55

标签: c++ exception try-catch rethrow

考虑以下C ++代码:

try {
  throw foo(1);
} catch (foo &err) {
  throw bar(2);
} catch (bar &err) {
  // Will throw of bar(2) be caught here?
}

我希望答案是否定的,因为它不在try块内,我在另一个问题中看到Java的答案是否定的,但是想确认C ++也没有。是的,我可以运行一个测试程序,但是我想知道我的编译器有错误的远程情况下行为的语言定义。

3 个答案:

答案 0 :(得分:23)

没有。只有try块中可能会捕获在关联的catch块中抛出的异常。

答案 1 :(得分:9)

不,它不会,层次结构上方的封闭式捕获块将能够捕获它。

示例示例:

void doSomething()
{
    try 
    {
       throw foo(1);
    } 
    catch (foo &err) 
    {
       throw bar(2);
    } 
    catch (bar &err) 
    {
       // Will throw of bar(2) be caught here?
       // NO It cannot & wont 
    }
}

int main()
{
    try
    {
        doSomething();
    }
    catch(...)   
    {
         //Catches the throw from catch handler in doSomething()
    }
    return 0;
}

答案 2 :(得分:2)

不,一个catch块处理最近的异常,所以如果你尝试... catch(Exception& exc)... catch(SomethingDerived& derivedExc),异常将在& exc块中处理

您可以通过异常委派给调用方法

来实现所需的行为