为什么以下内容不能处理重新抛出的异常?我尝试了所有组合,但没有一个会在最后一次捕获中显示输出,所以我很困惑!
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;
}
答案 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块中重新抛出相同的异常。