1. ホーム
  2. c++

[解決済み】コンストラクターからの例外のスローイング

2022-03-27 18:28:35

質問

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

設計上、コンストラクタから例外を投げることは問題ないのでしょうか?

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 の戻り値ですか?こうすれば、このような低レベルのオブジェクトに例外を使用する必要はありません。

どのように解決するのですか?

はい、失敗したコンストラクタから例外を投げるのが標準的な方法です。この FAQ では コンストラクタが失敗したときの処理 をご覧ください。init() メソッドを持つこともできますが、mutex のオブジェクトを作成する人は、 init() が呼ばれなければならないことを覚えておかなければなりません。に反するような気がします。 RAII の原則に従います。