构造函数中处理的异常已传播回.怎样

Exception handled in constructor propagated back. How?

本文关键字:传播 怎样 异常 处理 构造函数      更新时间:2023-10-16

我有一个类,它的构造函数将抛出异常。我还有一个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

根据标准,这是正确的。n3337.pdf第15.3节第15点内容如下:

如果控件到达构造函数或析构函数的函数try块的处理程序的末尾,则当前处理的异常将被重新抛出。否则,当控制到达函数try块(6.6.3)的处理程序的末尾时,函数返回。从函数try区块的末尾流出相当于没有值的返回;这导致在值返回函数中出现未定义的行为(6.6.3)

可以完全捕获并阻止异常在构造函数/析构函数体内部传播。但是,您不能用这种方式捕获基类/成员构造函数/析构函数抛出的异常。