我有一个类,其构造函数将抛出异常。我还有一个catch块来处理该异常。但是,我仍然看到异常会被传播回调用者,即使它被处理了。我知道,应该有一个例外来通知调用者构造失败。但在这种情况下,它是如何(重新抛出)发生的?
class Test
{
public:
Test()
try
{
std::cout << "in child constructor" << std::endl;
throw 3.2;
}
catch(int &e)
{
std::cout << "in int catch: " << e << std::endl;
}
catch (double &e)
{
std::cout << "in double catch: " << e << std::endl;
}
};
int main (void)
{
try
{
Test obj;
}
catch (int &e)
{
std::cout << "in main int catch: " << e << std::endl;
}
catch (double &e)
{
std::cout << "in main double catch: " << e << std::endl;
}
return 0;
}
我得到的输出是
in child constructor
in double catch: 3.2
in main double catch: 3.2
答案 0 :(得分:2)
根据标准,这是正确的。 n3337.pdf的第15.3节第15点读到:
如果控件到达构造函数或析构函数的函数 - try-block的处理程序的末尾,则当前处理的异常将被重新抛出。否则,当控制到达function-try-block(6.6.3)的处理程序的末尾时,函数返回。流出函数try-block的末尾相当于没有值的返回;这会导致值返回函数(6.6.3)中的未定义行为。
您可以完全捕获并阻止异常在构造函数/析构函数体内传播。但不能以这种方式捕获从基类/成员构造函数/析构函数抛出的异常。