2

C ++で例外を試してみると、ここの誰かが説明してくれることを期待していた奇妙な振る舞いに気づきました。以下のコードを見てください。

class Foo
{
public:

    Foo()
    {
        throw 0;
    }
};

class RandomException
{
public:

    Foo f;
};

void bar()
{
    throw RandomException();
}

// Case #1
int main()
{
    bar();
    return 0;
}

上記の場合、未処理の例外があります。main関数の本体を次のように変更すると、次のようになります。

// Case #2
int main()
{
    try
    {
        bar();
    }
    catch (int)
    {
    }

    return 0;
}

私は例外を飲み込んでいます。未処理の例外はなく、コードは正常に実行されます。そして、コードを次のように変更すると、次のようになります。

// Case #3
int main()
{
    try
    {
        bar();
    }
    catch (RandomException&)
    {
    }

    return 0;
}

今、私は再び未処理の例外があります。

ケース#2で未処理の例外がない理由を知りたいのですが、ケース#3では、どちらの場合も1intつと1つのタイプの2つの例外をスローしていRandomExceptionます。

例外のスロー中に例外がスローされた場合、C ++はどのように処理しますか?

4

1 に答える 1

4

ここでは、RandomExceptionオブジェクトの構築が例外で失敗するため、throw RandomException()が完了することはなく、int(0) がスローされます (構築の過程でRandomException)。

そのためのハンドラーがある場合 (ケース #2 のように)、制御はそのハンドラーに転送されます。そうでない場合 (ケース #3 のように)、std::terminate()が呼び出されます。

于 2013-03-22T13:17:53.827 に答える