考虑以下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 ++也没有。是的,我可以运行一个测试程序,但是我想知道我的编译器有错误的远程情况下行为的语言定义。
答案 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块中处理
您可以通过异常委派给调用方法
来实现所需的行为