首页  >  文章  >  后端开发  >  构造函数应该抛出异常吗?

构造函数应该抛出异常吗?

Susan Sarandon
Susan Sarandon原创
2024-11-10 07:36:02736浏览

Should Exceptions Be Thrown from Constructors?

从构造函数抛出异常:设计注意事项

在软件开发领域,关于从构造函数抛出异常是否合适的争论一直存在。这个问题引发了编程爱好者的讨论,最近一位同事的询问促使我们深入研究这个话题。

从设计的角度来看,构造函数抛出异常是否可以接受?

考虑一个类封装了 POSIX 互斥体的场景,如示例所示下面:

class Mutex {
public:
  Mutex() {
    if (pthread_mutex_init(&mutex_, 0) != 0) {
      throw MutexInitException();
    }
  }
};

在这种情况下,如果对 pthread_mutex_init 的调用失败,则互斥对象将变得不可用。抛出异常可确保对象不会在不一致的状态下创建,从而防止潜在的错误。

标准实践与成员函数方法

有人可能会争论该类可以有一个用于初始化的成员函数,该函数根据 pthread_mutex_init 调用的结果返回一个布尔值,而不是抛出异常。这种方法有其优点,但也带来了一个微妙的问题。它依赖于每个用户记住调用初始化函数,这可能会被忽略并导致未定义的行为。这种与 RAII 原则(资源获取即初始化)的偏差可能会损害对象的预期设计。

结论

虽然两种方法都有其优点,但从构造函数抛出异常成为标准。通过尽早失败,它可以防止创建不完整或不一致的对象,确保在执行任何进一步操作之前对象的状态有效。

以上是构造函数应该抛出异常吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn