0

私がこれを使用するときも同じですか?

catch(Exception e)
{
    throw new Exception("some Exception", e);
}

この:

catch(Exception e)
{
   throw new Exception("some Exception", e.InnerException);
}

または私は何かが欠けていますか?

4

3 に答える 3

5

2 番目の例では、キャッチされた例外を破棄し、代わりにその内部例外を使用しています。通常は、最初の例のようにコーディングします。

最初のケースでは、キャッチされた例外 ( e) は、InnerExceptionスローする新しい例外の になります。

catch(Exception e)
{
    throw new Exception("some Exception", e);
}

2 番目のケースでは、InnerExceptionofを使用しておりe、 からのデータeが失われます。

catch(Exception e)
{
   throw new Exception("some Exception", e.InnerException);
}
于 2012-06-07T18:20:20.763 に答える
3

一般的に言えば、最初の例の方がより正確です。別の例外の結果として新しい例外をスローする場合、元の例外を新しい例外の内部例外として含める必要があります。

ただし、これは普遍的に真実ではありません。これ、別のコードによる実際のエラーのラッピングを元に戻したいという非常に特殊なケースで役立ちます。

try {
  // some reflection call 
} catch (TargetInvocationException e) {
  // Reduce the layers of data a developer has to dig through by using the real
  // exception when I re-wrap
  throw new MyException("some message", e.InnerException);
}
于 2012-06-07T18:21:21.090 に答える
2

例外を再スローする方法は3つあります。

catch (Exception ex)
{
    throw;
}

元のスタックトレースを保持したまま、元の例外をスローします。

catch (Exception ex)
{
    throw ex;
}

元の例外をスローしますが、元のスタックトレースは失われます。スタックトレースは、この行を例外の発信元として表示するようになりました。

catch (Exception ex)
{
    throw new Exception("...", ex);
}

新しい例外をスローしますが、元の例外とそのスタックトレースをInnerException新しい例外のとして保持します。

最初のケースは、失敗した場合はクリーンアップする必要があるが、成功した場合はクリーンアップする必要がない場合に役立ちます。どちらの場合もクリーンアップする必要がある場合は、catch句ではなくfinally句を使用します。または、ここで例外が発生したことをログに記録し、呼び出し元に処理させたいだけです。

2番目のケースはまったく役に立ちません。なぜスタックトレースを隠しているのですか?これが役立つというまれな状況があるかもしれませんが、私は何も知りません。

3番目のケースは、単一のタイプの例外(またはタイプのファミリー)を返したい場合に最もよく使用されます。たとえば、あなたはテキスト解析メソッドであり、すべての(致命的ではない)例外をParseException(またはその他)に変換して、例外が発生したテキストの行番号などの追加の詳細を提供する必要があります。

提供する2番目の例では、キャッチされた例外は完全に破棄されます。新しい例外が生成され、元の例外のInnerExceptionがこの新しい例外のInnerExceptionになります。中間の例外を取り除くことが役立つシナリオは想像できません。

于 2012-06-07T18:33:47.143 に答える