2013-07-09 14 views
5

私はトップレベルで、リフレクションを介してメソッドを呼び出すコンポーネントを記述しています。私のコンポーネントを使いやすくするために、呼び出されたメソッドによってスローされた例外をキャッチして、それらをアンラッピングしたいと思います。TargetInvocationExceptionを正しくアンラップする方法は?

このように、私のようなものがあります:

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

はしかし、これは内部例外スタックトレースを吹き飛ばします。 throwはここでは使用できません(別の例外オブジェクトを再利用しているためです)。キャッチブロックで元の例外タイプ、メッセージ、およびスタックトレースがすべて通過することを確認するにはどうすればよいですか?

+0

質問タイトルにタグを付ける必要はありません。タグ付けを正しく行うだけで十分です。 – spender

+0

スタックトレースを混乱させるのはなぜ簡単だと思いますか? –

答えて

13

hereと回答した場合、.NET 4.5以降ではExceptionDispatchInfoクラスを使用して内部例外をラップすることができます。

try 
{ 
    someMethod.Invoke(); 
} 
catch(TargetInvocationException ex) 
{ 
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); 
} 
+1

答えとしてマークする必要があります。同じ問題があって、それが私を狂わせてしまった。 – Zwirbelbart

関連する問題