重新抛出异常

时间:2011-05-31 10:04:21

标签: c++ exception

为什么以下内容不能处理重新抛出的异常?我尝试了所有组合,但没有一个会在最后一次捕获中显示输出,所以我很困惑!

Derived D;

try {
       throw D;
} catch ( const Derived &d) {
       throw;
} catch (const Base &b) {
      cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived d) {
    throw;
} catch (const Base b) {
    cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived d) {
    throw;
} catch (const Base &b) {
    cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived &d) {
    throw;
} catch (const Base b) {
    cout << "caught!" << endl;
}

3 个答案:

答案 0 :(得分:15)

重新抛出不会由同一个try-catch块处理。它被抛到调用范围。

[except.throw](2003年措辞):

  

没有操作数的throw-expression重新抛出正在处理的异常。

  

当抛出异常时,控制权被转移到具有匹配类型的最近的处理程序(15.3);   “nearest”表示复合语句,ctor-initializer或函数体跟随的处理程序   try关键字最近由控制线程输入,但尚未退出

您的try块已退出,因此其处理程序不是候选者。因此,代码中的catch块都不能处理重新抛出。

不可否认,这是相当混乱的措辞。

答案 1 :(得分:9)

Rethrown异常应该被其他try..catch块捕获,而不是同一个try块的catch处理程序。见这个例子:

using namespace std;
class Base
{
public:
    virtual ~Base(){}
};

class Derived : public Base
{
};

void f()
{
    try
    {
        throw Derived();
    }
    catch(Derived& ex)
    {
        cout<<"Caught in f\n";
        throw;
    }

}

int main()
{
    try
    {
        f();
    }
    catch(Base& b)
    {
        cout<<"Caught in main\n";
    }

    return 0;
}

输出是:

  

抓住了

     

抓住主要

答案 2 :(得分:2)

这应该有效:

Derived D;


try{

    try {
        throw D;
    } catch ( const Derived &d) {
        throw;
    } catch (const Base &b) {
        cout << "caught!" << endl;
    }

} catch (const Base &b) {
    cout << "caught here!" << endl;
}

正如其他人所说,rethrow会从catch块中重新抛出相同的异常。