次の良い習慣はありますか? そうでない場合は何をすべきですか?
catch(Exception e)
{
throw new Exception(e.Message, e);
}
次の良い習慣はありますか? そうでない場合は何をすべきですか?
catch(Exception e)
{
throw new Exception(e.Message, e);
}
いいえ、同じメッセージでまったく同じタイプの別の例外をスローしている場合、これは良い方法ではありません。これを行うと、スタック トレースが複雑になり、デバッグがさらに面倒になります。
新しい例外をスローする場合は、元の例外とはかなり異なるものにする必要があります。たとえば、別のタイプにするか、他の方法 (より具体的なエラー メッセージなど) で例外の理由を明確にする必要があります。これらのいずれもできない場合は、 を使用して現在の例外を再スローしthrow;
ます。
または、さらに良いことに、まったくキャッチしないでください。実際に再スローすると、スタック トレースも少し混乱します (現在のフレームのエラー位置は、例外が発生した場所ではなく、再スロー ポイントに設定されます)。例外をハンドオフします。伝播させて、呼び出し元に処理させます。
キャッチされた例外を再スローするだけで、新しい例外を作成する必要はありません。
catch(Exception e)
{
// Do some logging...
throw;
}
例外の再スローに関するいくつかの読み物とそのスタック トレースへの影響: http://msdn.microsoft.com/en-us/library/ms182363(v=vs.100).aspx
それはあなたがしようとしていることに依存します。その正確なコードは無意味ですが、次のようなものです
catch(Exception ex)
{
throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex);
}
デバッグ中に非常に役立ちます。
例外を再スローする前に何かをする必要がある場合は、次のようにします。
catch(Exception e)
{
// Additional handling here
throw;
}
Throw
それ自体で、現在の例外を再スローするだけです。ここで処理する必要がない場合は、そもそもキャッチしないでください。
また、あなたの例では、あらゆるタイプの例外をキャッチしていますが、その代わりにジェネリックをスローしていますException
-おそらくあまり役に立ちません。
コードが本当にただの場合:
try
{
// something
}
catch(Exception e)
{
throw new Exception(e.Message, e);
}
try/catch を削除するだけです。生産的なことは何もしていません。と交換throw;
する方throw new...
が良いですが、それでも生産的ではありません。
キャッチで何か他のことが起こっている場合は、 Gromer の詳細に従って、単に使用しますthrow;