[解決済み】コンストラクターからの例外のスローイング
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 の原則に従います。
関連
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] 例外を正しく無視する方法
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複