12

初期化の例外が発生する可能性があると考えています。したがって、try/catchブロックを記述します。

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

このtry/catchブロックが通常のtry/catchブロックと同じように動作しないのはなぜですか?

完全なコード例:http://ideone.com/XjY2d

4

3 に答える 3

16

あなたの質問は次のようです:関数レベルのtry / catchが自動的に例外を再スローするのはなぜですか?オブジェクトの構築から例外をスローすると、このオブジェクトは、生きる前に死んでいると見なされます。そのすべてのサブオブジェクトが破棄されます。つまり、構築中に例外がスローされた場合、オブジェクトはありません。例外がスローされない場合は、オブジェクトの船体を手に入れることになります。これは明らかに望ましくありません。

于 2012-10-02T20:22:44.857 に答える
2

構築しているオブジェクトは実際には構築されていないため、単純なリターンはオプションではありません。この種のtry0-catchは、常に再スローします(catch句から独自の例外をスローしない限り)。

于 2012-10-02T20:21:41.253 に答える
2

これは、通常のtry-catchブロックではなく、関数レベルのtry/catchであるためです。を使用して明示的に行わない限り、自動的に再スローしますthrow

于 2012-10-02T20:27:20.490 に答える