C++的构造函数可以抛出异常么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的构造函数可以抛出异常么相关的知识,希望对你有一定的参考价值。

当然不可以设为private。
构造函数是用来初始化对象的,而析构函数是用来清除对象的。你在别的函数中申明一个类的对象时构造函数自动调用。而如果申明为private的话,该函数就没有这样的权限。析构函数是当对象消亡时,也是自动调用的。也存在权限问题。
参考技术A 1、构造函数想通知外部自己构造失败,只有抛异常这一个途径(没有返回值);
2、
如果不抛异常,那么构造函数执行完毕,从语言层面上编译器认为该对象是正确构造了的,其实构造没有按预想的进行,所以需要用状态变量、构造函数引用参数就可以让...

在构造函数中抛出 ArgumentNullException?

【中文标题】在构造函数中抛出 ArgumentNullException?【英文标题】:Throwing ArgumentNullException in constructor? 【发布时间】:2011-04-07 11:43:58 【问题描述】:

对于具有单个参数的构造函数,如果参数为空/空,是否可以在构造函数内部抛出 ArgumentNullException?或者,是否应该在实际使用参数的方法中抛出它?谢谢。

【问题讨论】:

【参考方案1】:

是的,如果它是完全必要的,那么抛出异常。你不应该*稍后抛出异常。

永远记住"Fail Early Principle"。概念现在失败,因此您不会浪费时间调试或遇到意外的系统功能。

或者,您也可以为“”抛出 ArgumentException,为 null 抛出 ArgumentNullException。无论哪种情况,请确保您抛出一个有效的异常消息。


始终是管理异常的好参考文章:Good Exception Management Rules of Thumb


关于@Steve Michelotti 所说的旁注(因为我是 CodeContracts 的忠实粉丝)

Contract.Requires<ArgumentNullException>(inputParemeter!= null, "inputparameter cannot be null");
Contract.Requires<ArgumentException>(inputParemeter!= "", "inputparameter cannot be empty string");

或者

Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(inputParemeter), "inputparameter cannot be null or empty string");

【讨论】:

另一个好的规则是“尽早失败”。尤其是处理参数和自变量,尽早发现错误,或者尽可能接近错误发生的时空点。 你是对的!我一直在努力寻找正确原则的“名称”。【参考方案2】:

在构造函数中抛出它是好的 - .NET 框架中有几个类可以做到这一点。此外,请查看 code contracts 了解此内容。

【讨论】:

【参考方案3】:

听起来,你将一个参数传递给构造函数,由类保存,以便稍后在其他方法中使用。如果您实际上没有在构造函数中使用参数,您可能应该考虑将参数移动为实际使用它的方法的参数。

【讨论】:

如果可以的话我会,但它是基于接口执行的一系列任务的一部分,所以我无法修改方法签名。 在这种情况下,我同意其他所有人的观点,即在构造函数中失败绝对是最好的选择。【参考方案4】:

我会检查你在调用构造函数时设置的属性...这样在所有情况下都会抛出异常。

【讨论】:

没有迹象表明构造函数正在设置属性。 是的,但它会被抓住吗?类操作通常包含在尝试块中而不是类创建中。

以上是关于C++的构造函数可以抛出异常么的主要内容,如果未能解决你的问题,请参考以下文章

构造函数析构函数抛出异常的问题

c++析构函数需要异常处理吗?如需要实现有何要求?

C++异常处理的编程方法(阿愚,整整29集)

Java:构造函数中抛出异常,我的对象仍然可以创建吗?

C++学习40 抛出自己的异常

为啥在构造函数中抛出异常会导致空引用?