我正在阅读关于C ++的一些注释,并遇到了以下问题
问:构造函数可以抛出异常吗?如何在构造函数失败时处理错误?
答:构造函数永远不会抛出错误。
现在这个答案让我很困惑,只是为了确保我去了online并且读到你总是可以从构造函数中抛出异常。我只是想确定这是否是笔记中的拼写错误,而且我可能不会遗漏一些重要内容。
答案 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