コンストラクタから例外をスローする 質問する

コンストラクタから例外をスローする 質問する

コンストラクターから例外をスローすることについて同僚と議論しており、フィードバックが欲しいと思いました。

設計の観点から、コンストラクターから例外をスローしても問題ありませんか?

クラスで 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その中で の戻り値に基づいて bool を返すように呼び出すほうがよいでしょうかpthread mutex_init。この方法では、このような低レベルのオブジェクトに対して例外を使用する必要がありません。

ベストアンサー1

はい、失敗したコンストラクタから例外をスローするのが標準的な方法です。このFAQを読んでください。失敗したコンストラクタの処理詳細については、init() メソッドを使用することもできますが、mutex のオブジェクトを作成する人は誰でも init() を呼び出す必要があることを覚えておく必要があります。RAII原理。

おすすめ記事