4

フォローアップ: キャッチできない例外、pt 2

カスタム バインディング エンジンを作成しています。私のコンバーターは、ターゲット要素に DataContext が設定される前に呼び出されています。DataContext が最終的に値を受け取ったときに更新されるため、これ自体は大したことではありません。問題を引き起こしているのは、DataContext が null であるために取得している NullReferenceException です。これは、キャッチしたくないようです。

値コンバーターで例外をキャッチしようとしていますが:

try {
    return ( (MethodInfo)_member ).Invoke( parameter, null );
} catch {
    return null;
}

何らかの理由で、デバッガーはこの時点でまだ停止しています。

代替テキスト

(これは、catch ブロックのある場所までスタック トレースを少しバックアップしたものです。実際の例外は _member メソッド内で発生します。奇妙な点は、catch ブロックがグレー表示されているにもかかわらず、ブレークポイントに到達していないことです。)

今、私はそれがキャッチされている別のアセンブリで例外が発生している可能性があると考えています(これを再利用可能なクラスライブラリにパッケージ化しようとしており、上記の _member はアプリケーションアセンブリのメソッドを指しています)。

デバッガーなしで小さなテスト アプリを実行すると正常に動作しますが、私のアプリケーションはもう少し堅牢であり、これが原因でトリガーされる一般的な例外処理があります。

例外を想定どおりにキャッチするために使用できる属性または何か(または、おそらく欠落しているリフレクションパラメーター)があるかどうか疑問に思っています。

更新:これは、リフレクションと MethodInfo.Invoke の使用によるものに違いないと確信しています。例外はNullReferenceExceptionの内部例外を持つ「TargetInvocationException」の最初のようです。呼び出し例外がコールスタックの外側で何らかの形で発生しているため、呼び出しスタック内でキャッチされていないようです。私はスレッドで何もしていませんが、おそらく MethodInfo.Invoke 内で何らかの暗黙のスレッド シフトが行われているのでしょうか?

これを強制的にキャッチする方法、またはこの問題を起こさないメソッド名からメソッドを呼び出す別の方法を誰かが知っていますか? 私はちょっと困惑しています。

4

2 に答える 2

1

NullReferenceExceptionデバッガーの例外設定をチェックして、がスローされたときにデバッガーにブレークするように指示しているかどうかを確認します。

于 2010-06-16T01:08:07.547 に答える
0

呼び出し後に例外を問題なくキャッチできると確信しており、例外をキャッチするために必要なリフレクション固有のメカニズムはありません。

呼び出しているメソッドは、おそらくスレッド化を使用して子スレッドで例外をスローしていますか? これにより、try-catch ステートメントを終了する前に終了していない非同期スレッドで例外が発生した場合、try-catch が例外を見逃す可能性があります。

于 2010-06-16T01:12:41.460 に答える