Ich habe eine Debatte mit einem Kollegen über das Werfen von Ausnahmen von Konstruktoren, und dachte, ich würde gerne etwas Feedback.
Ist es aus gestalterischer Sicht in Ordnung, Ausnahmen von Konstruktoren auszulösen?
Angenommen, ich wickle eine POSIX-Mutex in eine Klasse ein, dann würde das in etwa so aussehen:
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_;
};
Meine Frage ist: Ist dies die Standardmethode? Denn wenn die pthread mutex_init
Aufruf fehlschlägt, ist das Mutex-Objekt unbrauchbar, so dass das Auslösen einer Ausnahme sicherstellt, dass der Mutex nicht erstellt wird.
Sollte ich lieber eine Mitgliedsfunktion init für die Mutex-Klasse erstellen und die pthread mutex_init
in dem ein bool zurückgegeben wird, das auf pthread mutex_init
Rückkehr? Auf diese Weise muss ich keine Ausnahmen für ein solches Low-Level-Objekt verwenden.