c++ - 构造函数中处理的异常传播回来。如何?

标签 c++ exception constructor

我有一个类,其构造函数将抛出异常。我还有一个 catch block 来处理该异常。但是,我仍然看到异常被传播回调用者,即使它已被处理。我知道,应该有一个异常来通知调用者构建失败。但在这种情况下,它(重新抛出)是如何发生的呢?

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 点内容如下:

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

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

关于c++ - 构造函数中处理的异常传播回来。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600869/

相关文章:

c++ - 添加到数组 C++

java - 在类构造函数中创建两个选项

c++ - 虚类的析构函数到底做了什么?

c# - C# 中是否有像 C++ 中的指针?安全吗?

c++ - 观察者模式特化

c++ - 静态函数中的静态变量可以移动到内存中的新地址吗?

python - urllib2 尝试并排除 404

java - 缓冲读取器错误

java - 在finally block 中重新抛出异常

java - Constructor.newInstance() 不知道参数顺序?