最佳答案
我正在与一位同事讨论从构造函数抛出异常的问题,我想我需要一些反馈。
从设计的角度来看,从构造函数抛出异常是否正确?
假设我在一个类中包装了一个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
调用失败,互斥量对象就不可用,因此抛出异常可以确保互斥量不会被创建。
我是否应该为Mutex类创建一个成员函数init并调用pthread mutex_init
,其中将返回基于pthread mutex_init
的返回值的bool值?这样我就不必为如此低级的对象使用异常了。