我正在与一位同事就从构造函数中抛出异常进行辩论,并认为我想要一些反馈。
从设计的角度来看,可以从构造函数中抛出异常吗?
假设我在一个类中包装了一个 POSIX 互斥体,它看起来像这样:
class Mutex { public: Mutex() { if (pthread_mutex_init(&mutex_, 0) != 0) { throw MutexInitException(); } } ~Mutex() { pthread_mutex_destroy(&mutex_); } void lock() { if (pthread_mutex_lock(&mutex_) != 0) { throw MutexLockException(); } } void unlock() { if (pthread_mutex_unlock(&mutex_) != 0) { throw MutexUnlockException(); } } private: pthread_mutex_t mutex_; };
我的问题是,这是标准的做法吗?因为如果pthread mutex_init调用失败,互斥对象将不可用,因此抛出异常可确保不会创建互斥对象。
pthread mutex_init
我是否应该为 Mutex 类创建一个成员函数 init 并pthread mutex_init在其中调用将基于pthread mutex_init的返回返回一个 bool ?这样我就不必为这样一个低级别的对象使用异常。
是的,从失败的构造函数中抛出异常是执行此操作的标准方法。阅读有关处理失败的构造函数的常见问题解答以获取更多信息。有一个 init() 方法也可以,但是每个创建 mutex 对象的人都必须记住必须调用 init()。我觉得这违反了RAII原则。