1

Q: スタックのアンワインド時に例外をスローしてキャッチするのは安全ですか? それとも、アプリケーションterminateは 2 回目のスローで呼び出しますか?

最小限の例:

void some_function()
{
    try
    {
        // do stuff here that can throw
        throw std::runtime_error("blah");
    } catch(const std::exception& re)
    {
        try // this code could be in some function called from here
        {
            // do something with re here that throws a logical_error
            throw std::logical_error("blah blah"); // does this call terminate?
        } catch(const std::logical_error& le)
        {
        }
    }
}

この質問を読んだ後、私は興味を持ちました。

catch(...)注:デストラクタでできる/すべきであることは知っていますが、ブロックtry/catch内に aを持つことは一般的に意味がありcatchますか - おそらく例外で呼び出されるいくつかの関数(re私の例では)ですか?

4

2 に答える 2

5

それは実際にはスタックの巻き戻し中ではありません。catch ブロックに入ると、スタックは既に巻き戻されています。

はい、そのコードは合法です。次の質問を参照してください: Nested try...catch inside C++ exception handler?

于 2013-03-19T19:24:24.283 に答える
2

Pubby's answer は、あなたが説明しているシナリオに最もよく答えます。

補足として、スタックの巻き戻し中に実行される唯一のユーザー コードはデストラクタ (およびそれらのデストラクタが呼び出すコード) です。

このシナリオでデストラクタを実行 する場合throw、標準ではそれstd::terminate()が呼び出されると指定されています。

于 2013-03-19T19:29:09.597 に答える