8

これらのシナリオで例外を処理することは可能ですか?

  1. main() に入る前にコンストラクターからスローされます
  2. main() を離れた後にデストラクタからスローされます
4

4 に答える 4

22
  1. コンストラクターをその中に try-catch でラップできます。
  2. いいえ、デストラクタで例外をスローすることは絶対に許可しないでください。

コンストラクターに 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'; }
};
于 2010-01-08T08:28:34.867 に答える
0

短い答え:いいえ。

コンストラクターで例外をスローするグローバル オブジェクトは、ハンドルされない例外を引き起こします (つまり、terminate呼び出されます)。

デストラクタで例外をスローするクラスは、壊れたクラスです。

グローバルではなくシングルトン パターンを使用すると、より多くのオプションが得られます。

于 2010-01-08T09:27:41.767 に答える
0

問題のオブジェクトの構築/破棄の前に例外ハンドラーを設定して、それらの例外を処理できるようにすることができる場合があります。

コンストラクターの場合、コンストラクター内で例外をキャッチできる奇妙な新しい構文がいくつかあります。それがどのように機能するのかわからず、多くのコンパイラで一般的に実装されていません。

デストラクタの場合、デストラクタの内容を try { code(); でラップする必要があります。} catch(...) {} ブロック。そのデストラクタで何を達成したいかによっては、これが常に望ましい動作であるとは限りません。

于 2010-01-08T08:28:31.340 に答える