C ++中是否有任何模式,所以如果出现故障,我可以在构造函数中终止对象创建?那么调用构造函数的客户端获得了有关失败的obj创建的信息?
答案 0 :(得分:11)
是的,您可以:抛出异常。这几乎是唯一明智的方法。通过选择适当的异常类(标准或您自己的)并提供良好的错误消息等,您将能够告诉调用者出了什么问题。
常见问题解答has more details。
答案 1 :(得分:5)
您需要抛出异常。这是处理失败对象创建的最佳方法。
Constructor Failures 应该是Herb Sutter的GOTW的有趣读物。
另一种方法是,如果构造函数遇到错误,请设置状态位并让用户调用IsOK()
以查看构造是否实际有用。
但这被视为已过时。
赫布说:我发现“如果构造函数遇到错误,设置一个状态位并让用户调用IsOK()来查看构造是否实际工作”方法过时,危险,乏味,并且绝不比抛出更好例外。
答案 2 :(得分:1)
抛出异常是处理异常的常用方法,但是,我不鼓励你从构造函数中抛出异常的模式。
我们无法确保构造函数不会抛出异常,但在我看来依赖于构造函数抛出的异常的反模式。 有一个微妙的区别:)
我通常更喜欢处理不应该失败的构造函数,并且在可以返回值或抛出异常的Initialize方法中移动可能失败的合理逻辑。
当代码变得更复杂时,它更干净并避免让您头疼!
这就是为什么我这么说的例子:http://www.cs.technion.ac.il/~imaman/programs/throwingctor.html
另一篇有趣的帖子是C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]
答案 3 :(得分:1)