我正在和一位同事就从构造函数中抛出异常进行辩论,想要听取一些反馈意见。
从设计的角度来看,从构造函数中抛出异常是否可以接受?
比如说,我正在将一个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
的返回值返回一个布尔值?这样我就不必为这种低级对象使用异常了。
std::lock_guard
的类似实现。 - Laurent Grégoirelock
和unlock
,这样你的互斥类型才能与std::lock_guard
一起工作;他正在重新实现std::mutex
,而不是std::lock_guard
,这就是C++标准库中这两个类分开的原因。 - ShadowRanger