2

次の良い習慣はありますか? そうでない場合は何をすべきですか?

catch(Exception e)
{
     throw new Exception(e.Message, e);
}
4

5 に答える 5

18

いいえ、同じメッセージでまったく同じタイプの別の例外をスローしている場合、これは良い方法ではありません。これを行うと、スタック トレースが複雑になり、デバッグがさらに面倒になります。

新しい例外をスローする場合は、元の例外とはかなり異なるものにする必要があります。たとえば、別のタイプにするか、他の方法 (より具体的なエラー メッセージなど) で例外の理由を明確にする必要があります。これらのいずれもできない場合は、 を使用して現在の例外を再スローしthrow;ます。

または、さらに良いことに、まったくキャッチしないでください。実際に再スローすると、スタック トレースも少し混乱します (現在のフレームのエラー位置は、例外が発生した場所ではなく、再スロー ポイントに設定されます)。例外をハンドオフします。伝播させて、呼び出し元に処理させます。

于 2012-10-11T20:07:44.177 に答える
4

キャッチされた例外を再スローするだけで、新しい例外を作成する必要はありません。

catch(Exception e)
{
    // Do some logging...
    throw;
}

例外の再スローに関するいくつかの読み物とそのスタック トレースへの影響: http://msdn.microsoft.com/en-us/library/ms182363(v=vs.100).aspx

于 2012-10-11T20:08:24.717 に答える
2

それはあなたがしようとしていることに依存します。その正確なコードは無意味ですが、次のようなものです

catch(Exception ex)
{
    throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex);
}

デバッグ中に非常に役立ちます。

于 2012-10-11T20:11:38.853 に答える
1

例外を再スローする前に何かをする必要がある場合は、次のようにします。

catch(Exception e)
{
     // Additional handling here
     throw;
}

Throwそれ自体で、現在の例外を再スローするだけです。ここで処理する必要がない場合は、そもそもキャッチしないでください。

また、あなたの例では、あらゆるタイプの例外をキャッチしていますが、その代わりにジェネリックをスローしていますException-おそらくあまり役​​に立ちません。

于 2012-10-11T20:12:27.943 に答える
0

コードが本当にただの場合:

try
{
  // something
}
catch(Exception e)
{
  throw new Exception(e.Message, e);
}

try/catch を削除するだけです。生産的なことは何もしていません。と交換throw;する方throw new...良いですが、それでも生産的ではありません。

キャッチで何か他のことが起こっている場合は、 Gromer の詳細に従って、単に使用しますthrow;

于 2012-10-11T20:18:49.570 に答える