これらのシナリオで例外を処理することは可能ですか?
- main() に入る前にコンストラクターからスローされます
- main() を離れた後にデストラクタからスローされます
これらのシナリオで例外を処理することは可能ですか?
コンストラクターに try-catch を埋め込む方法のあまり知られていない面白い機能:
object::object( int param )
try
: optional( initialization )
{
// ...
}
catch(...)
{
// ...
}
はい、これは有効な C++ です。ここでの追加の利点は、クラスのデータ メンバーのコンストラクターによってスローされた例外が、ctor イニシャライザーで言及されていないか、ctor イニシャライザーがない場合でも、try によってキャッチされるという事実です。
struct Throws {
int answer;
Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};
struct Contains {
Throws baseball;
Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};
短い答え:いいえ。
コンストラクターで例外をスローするグローバル オブジェクトは、ハンドルされない例外を引き起こします (つまり、terminate
呼び出されます)。
デストラクタで例外をスローするクラスは、壊れたクラスです。
グローバルではなくシングルトン パターンを使用すると、より多くのオプションが得られます。
問題のオブジェクトの構築/破棄の前に例外ハンドラーを設定して、それらの例外を処理できるようにすることができる場合があります。
コンストラクターの場合、コンストラクター内で例外をキャッチできる奇妙な新しい構文がいくつかあります。それがどのように機能するのかわからず、多くのコンパイラで一般的に実装されていません。
デストラクタの場合、デストラクタの内容を try { code(); でラップする必要があります。} catch(...) {} ブロック。そのデストラクタで何を達成したいかによっては、これが常に望ましい動作であるとは限りません。