4

次の C++ コードを検討してください。

class MyException {};

void someFunction()
{
    try
    {
        /// ... code that may throw
    }
    catch(std::exception& e )
    {
        throw MyException();
    }
}

質問

例外 e は、catch ブロックの先頭で吸収されるか、catch ブロックの最後で吸収されるか?

2 番目のケースでは、新しい例外をスローすると、飛行中の 2 つの例外が発生します。これは、私が望んでいるものではありません。std::exception を吸収して、自分のタイプの 1 つを開始したいと考えています。

4

2 に答える 2

3

いいえ、そうすべきです。これthrow myException()は、最初の例外が捕捉されて「飛行中」でなくなった場合にのみ発生します。

この設計パターンは、コードが使用している別のライブラリからのエラー メッセージを、コードのユーザーがより適切に関連付けることができるエラーに "変換" するためによく使用されます。

あるいは、単なるもの以上のことをしたい場合throw(たとえば、リソースの整理を行いたいとしますが、実際には RAII を介して、つまりデストラクタから行う必要があります)、次の方法で元の例外を単純に再スローすることができます。

try
{
    // ... code that may throw
}
catch(...) // catches anything
{
    // ... code that runs before rethrowing
    throw;    // rethrows the original catch
}
于 2015-11-13T08:41:18.573 に答える
1

throw;より高いコンテキストで同じ例外を再スローするには、catch ブロックでステートメントだけで十分です。再び同じ例外をスローします。新しい例外は生成されません。だから戦いはありません:)

タイプ A の例外をキャッチしてからタイプ B の例外をスローする場合、その方法は絶対に正しいです。この場合、古い例外 (タイプ A) はキャッチ (吸収) され、新しい例外 (タイプ B) のみがより高いコンテキストにスローされます。だから、再び戦いはありません:)

于 2015-11-13T08:56:15.980 に答える