构造函数和例外

时间:2013-05-17 15:50:51

标签: c++

我正在阅读关于C ++的一些注释,并遇到了以下问题

  

问:构造函数可以抛出异常吗?如何在构造函数失败时处理错误?

     

答:构造函数永远不会抛出错误。

现在这个答案让我很困惑,只是为了确保我去了online并且读到你总是可以从构造函数中抛出异常。我只是想确定这是否是笔记中的拼写错误,而且我可能不会遗漏一些重要内容。

3 个答案:

答案 0 :(得分:4)

当然可以。甚至标准容器(例如std::vector)也会从构造函数中抛出std::bad_alloc。这FAQ说实话。

答案 1 :(得分:4)

如果他们一般都在讨论构造函数,那么这些注释是错误的。 Ctors确实可以正常投掷。也许那是在讨论一个特殊的阶级来保证无人建造?

另一方面,我们强烈建议您进行编码,以便析构函数永远不会抛出。他们这样做是合法的,但是在堆栈展开期间抛出异常会导致程序立即终止(调用std::terminate)。

答案 2 :(得分:1)

您可以从构造函数中抛出异常,但要小心:如果没有正确构造对象,则不会调用析构函数。

class Foo
{
public:
    Foo(int i)
    {
        throw i;
    }

    ~Foo()
    {
        std::cout << "~Foo()" << std::endl;
    }
};

int main()
{
    try
    {
        Foo f(42);
    }
    catch(...)
    {
        std::cout << "Catched" << std::endl;
    }

    return 0;
}

输出:

Catched

要解决此问题,您应该将一个构造函数封装到另一个构造函数中:

Foo()
{

}

Foo(int i): Foo()
{
    throw i;
}

输出:

~Foo()
Catched