У меня возникли споры с коллегой о том, как бросать исключения из конструкторов, и я думал, что мне нужна некоторая обратная связь.
Можно ли исключать исключения из конструкторов с точки зрения дизайна?
Предположим, что я обматываю мьютекс 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 на основе pthread mutex_init
return? Таким образом, мне не нужно использовать исключения для такого объекта с низким уровнем.