在catch块中抛出的异常是否会被后续的catch块捕获?

27

考虑以下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个回答

29

不可以。只有在相关的 try 块中抛出的异常才能被 catch 块捕获。


9
不会的,一个在层次结构上更高层的封闭catch块将能够捕获它。 示例:
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;
}

1
应该改进答案,明确指出main()函数中的catch块将捕获bar(2)。这样可以使答案更加清晰。 - zar

2
不,catch块处理最近的异常,所以如果您尝试...catch ( Exception &exc )...catch ( SomethingDerived &derivedExc ),异常将在&exc块中处理。通过将异常委托给调用方法,您可能会实现所需的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接