web-dev-qa-db-ja.com

TargetInvocationExceptionがIDEによってキャッチされないものとして扱われるのはなぜですか?

リフレクションを使用してオブジェクトからプロパティ値をプルするコードがいくつかあります。場合によっては、プロパティにnull参照などがあるため、プロパティが例外をスローすることがあります。

object result;
try
{
    result = propertyInfo.GetValue(target, null);

}
catch (TargetInvocationException ex)
{
    result = ex.InnerException.Message;
}
catch (Exception ex)
{
    result = ex.Message;
}

最終的にコードは正しく機能しますが、デバッガーで実行している場合は次のようになります。

プロパティが例外をスローすると、IDEは、例外がキャッチされなかったかのようにデバッガーにドロップします。実行を押すと、プログラムがフロースルーし、例外が実際のTargetInvocationExceptionとして出力されます。 InnerExceptionプロパティの例外。

どうすればこれを防ぐことができますか?

25
Jason Coyne

これは「設計による」ようです。何が起こるかというと、メニューツールオプションデバッグ一般マイコードのみを有効にするを有効にします。

As方法:ユーザーが処理しない例外を中断するは次のように述べています。

DebugExceptionsダイアログには、「Enable Just MyCode」のときに追加の列(例外がユーザー未処理の場合は中断)が表示されますオンになっています。

基本的に、これは、例外がコードの境界を離れるときはいつでも(この場合、.NET Frameworkリフレクションコードに分類されます)、例外がユーザーコードを離れたと見なすため、VisualStudioが中断することを意味します。スタックの後半でユーザーコードに戻るかどうかはわかりません。

したがって、2つの回避策があります。メニューツールオプションJust My Codeを無効にする)→デバッグ一般またはメニューのユーザー未処理の.NET Framework例外からチェックボックスを削除しますデバッグ例外ダイアログ。

30
Kirill Osenkov

編集:私はこれを自分で試したところですが、反射の扱いが少し異なるようです。リフレクション呼び出しは、デバッガーに関する限り、新しいレベルの「処理済み」を開始するものと考えることができます。例外が変換されてTargetInvocationExceptionとして再スローされる前に、その例外をキャッチするものはないため、侵入します。 。それを抑制する方法があるかどうかはわかりませんが、それは非常に頻繁に発生しますか?例外が発生する多くの操作を定期的に実行している場合は、設計を再検討することをお勧めします。


元の回答

デバッグ/例外...に移動し、設定が何であるかを確認します。 TargetInvocationException(または階層の上位にあるもの)で[スロー]チェックボックスがオンになっている場合、この動作が表示されます。

4
Jon Skeet