从构造函数抛出异常:详细讨论
在 C 中处理对象初始化时,会出现在构造函数中使用异常的问题。为了彻底检查此主题,我们将深入研究涉及使用互斥包装类的真实场景。
问题:
在为了尝试围绕 POSIX 互斥体提供安全接口,程序员设计了以下内容class:
class Mutex { public: Mutex() { if (pthread_mutex_init(&mutex_, 0) != 0) { throw MutexInitException(); } } ... };
问题:
考虑到构造函数抛出异常的影响,这种设计方法是否合适?
答案:
答案是肯定的。从遇到失败的构造函数抛出异常被认为是面向对象编程中的标准做法。根据“Exceptional C FAQs”,如果类“在构造期间无法进入有效状态,则构造函数应抛出异常。”
在此上下文中使用异常可确保不会创建无效对象,从而缓解与依赖错误互斥体相关的风险。
替代方案方法:
另一种解决方案,不太受欢迎但仍然可行,是在 Mutex 类中创建一个 init() 成员函数,然后该函数将执行必要的初始化。这种方法引入了一个警告,即每个使用互斥体的客户端代码在使用该对象之前都必须显式调用 init()。
从构造函数抛出异常的好处:
主要从构造函数抛出异常的优点是它通过防止在初始化期间创建无效对象来增强安全性。它还符合 RAII(资源获取即初始化)原则,支持者认为该原则与基于异常的编程非常一致。
结论:
虽然可能存在固执己见的争论关于构造函数中异常的使用,专家们的共识很明确:在确保完整性和有效性的情况下,从构造函数中抛出异常是一种可以接受的方法初始化期间对象的。
以上是C 中的构造函数应该抛出异常吗?的详细内容。更多信息请关注PHP中文网其他相关文章!