10

トップレベルでリフレクションを介してメソッドを呼び出すコンポーネントを作成しています。コンポーネントを使いやすくするために、呼び出されたメソッドによってスローされたすべての例外をキャッチしてラップを解除したいと考えています。

したがって、私は次のようなものを持っています:

try { method.Invoke(obj, args); }
catch (TargetInvocationException ex) {
    throw ex.InnerException;
}

ただし、これにより内部の例外スタック トレースが吹き飛ばされます。ここだけでは使用できませんthrow(別の例外オブジェクトを再スローしているため)。元の例外の種類、メッセージ、およびスタック トレースがすべて通過するようにするには、catch ブロックで何ができますか?

4

1 に答える 1

29

ここで回答したように、.NET 4.5 以降では、ExceptionDispatchInfoクラスを使用して内部例外をラップ解除できます。

try
{
    someMethod.Invoke();
}
catch(TargetInvocationException ex)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
于 2014-10-10T15:29:47.113 に答える