初期化リストの試し/キャッチはどのように機能しますか?
-
12-12-2019 - |
質問
初期化の例外が発生する可能性があると考えています。だから私たちは試し/キャッチブロックを書く。
int f(){
throw 1;
}
class A
{
public:
A() try : _k(f())
{}
catch (int)
{
std::cout << "Exception 1" << std::endl;
}
private:
int _k;
};
.
しかしキャッチは1つのレベルのより深く例外を再現します。それは次のコード
を意味しますtry
{
A a;
} catch(int)
{
std::cout << "Exception 2" << std::endl;
}
.
出力:
Exception 1
Exception 2
.
なぜこの試行/キャッチブロックは、普通の試行/キャッチブロックと同じように振る舞うのか?
フルコード例: http://ideone.com/xjy2d
解決
あなたの質問は次のとおりです。オブジェクトの建設から例外を投げることで、このオブジェクトはそれが命になる前に死んでいると見なされます。そのすべてのサブオブジェクトは破壊されます。つまり、構造中に例外がスローされている場合は、オブジェクトがありません。例外がスローしない場合は、オブジェクトを手に包んだ場合は。これは明らかに望ましくない。
他のヒント
あなたが建設しているオブジェクトは実際には構築されていないので、簡単なReturnはオプションではありません。この種のtry0-catch(あなたがcatch句からあなた自身の例外をスローされていない限り)常に再生します。
は普通の試し漁獲部ブロックではなく、機能レベルの試み/キャッチなので。throw
を使用して明示的に実行しない限り、自動的に再表示されます。
所属していません StackOverflow