从构造函数抛出异常:设计注意事项
在软件开发领域,关于从构造函数抛出异常是否合适的争论一直存在。这个问题引发了编程爱好者的讨论,最近一位同事的询问促使我们深入研究这个话题。
从设计的角度来看,构造函数抛出异常是否可以接受?
考虑一个类封装了 POSIX 互斥体的场景,如示例所示下面:
class Mutex { public: Mutex() { if (pthread_mutex_init(&mutex_, 0) != 0) { throw MutexInitException(); } } };
在这种情况下,如果对 pthread_mutex_init 的调用失败,则互斥对象将变得不可用。抛出异常可确保对象不会在不一致的状态下创建,从而防止潜在的错误。
标准实践与成员函数方法
有人可能会争论该类可以有一个用于初始化的成员函数,该函数根据 pthread_mutex_init 调用的结果返回一个布尔值,而不是抛出异常。这种方法有其优点,但也带来了一个微妙的问题。它依赖于每个用户记住调用初始化函数,这可能会被忽略并导致未定义的行为。这种与 RAII 原则(资源获取即初始化)的偏差可能会损害对象的预期设计。
结论
虽然两种方法都有其优点,但从构造函数抛出异常成为标准。通过尽早失败,它可以防止创建不完整或不一致的对象,确保在执行任何进一步操作之前对象的状态有效。
以上是构造函数应该抛出异常吗?的详细内容。更多信息请关注PHP中文网其他相关文章!