2016-05-01 6 views
3

私はInvokeメソッドで遊んでいて、ターゲットメソッドで例外がスローされたときに実現しました。TargetInvokationExceptionが実際に発生します。 C#の作成者がこのアプローチを使用する理由を理解できません。それは私には意味がありません。なぜC#にTargetInvokationExceptionが導入されましたか?

元の例外をInnerExceptionとして持つ二次的な例外を投げるのではなく、元の例外を投げるのはなぜですか?

+2

'Invoke'は' InvalidOperationException'や 'ArgumentException'のようなより一般的な例外の型を投げます。もしあなたがこれらのいずれかをキャッチしているのであれば、リフレクションクラス自身によって生成されたかどうか、あなたは違った扱いをするかもしれません。 'TargetInvocationException'は、例外がどこで生成されたかについて明確です。 –

答えて

1

Invoke(またはDynamicInvoke)は、「実際」のメソッドを実行した後に、独自の例外をスローすることができます。

TargetInvocationExceptionは、エラーの原因が何であるかを判断することができます。デリゲートクラスまたはメソッドのコード。

3

ちょうどペナントであるために、これは.Netフレームワーク例外です.C#例外ではありません。

リフレクションを使用すると、呼び出し元と呼び出し先(呼び出しを開始するメソッドと呼び出される最終的なターゲットメソッド)が非常に緩やかに結合されます。 ソースとターゲットは、コンパイル時にはリンクされておらず、お互いに何も知らない完全に異なるアセンブリに存在することができます。このプロセスの動的性質のため、event aggregation approachをラップしてから新しい例外をスローするのが正しいです。同じアプローチは、TPLのような他の場所でも使用されます.TPLでは、タスクにスローされたエラーが再スローされる前にSystem.Aggregate exceptionにラップされます。

関連する問題