1

WPF は、予期しない例外を処理するための非常に便利な方法を提供します。Application.DispatcherUnhandledExceptionイベントにハンドラーをアタッチするだけで、未処理の例外はすべて次のようになります。

Application.Current.DispatcherUnhandledException += (sender, e) => {
    // Show message, log exception, etc.
};

これは、WPF アプリケーション プロジェクトに最適です。これで、 WPF以外のアプリケーションから呼び出されるWPF windows を含むライブラリができました (これはレガシー VBA アプリであり、WPF ライブラリは COM 相互運用機能を介してアクセスできるようになっています)。

つまり、WPF ウィンドウを作成して開き、表示することはできます (これは正常に動作します)が、インスタンスがありませんApplicationApplication.Currentですnull。私は WPF クラスを使用していますが、WPF アプリケーション フレームワークの外でそれらを操作しています。

現在、このソリューションの唯一の欠点は、WPF ウィンドウ イベント ハンドラー コードの例外が黙って飲み込まれることです。

void Button_click(sender as object, e as RoutedEventArgs) {
    ...
    // some exception occurs here, but nobody hears her scream
    ...
}

私はそれが好きではありません。それらをログに記録してエラーメッセージを表示したいと思います。

私の質問: このシナリオで未処理の例外をグローバルにキャッチする方法はありますか、それとも、記述したすべての WPF ウィンドウ イベント ハンドラー コードに一般的な try-catch-log ブロックを追加する必要がありますか?

私が試したこと:

  • に取り付けAppDomain.CurrentDomain.UnhandledExceptionます。うまくいきません。例外はありません。
  • WPF と Win32 の相互運用性に関する MSDN の関連部分を読む ( Ref 1Ref 2Ref 3 )。そこには例外は記載されていません。
4

1 に答える 1

2

Dispatcher代わりににアタッチします。

Dispatcher.CurrentDispatcher.DispatcherUnhandledException += (sender, e) => { 
    // Show message, log exception, etc. 
}; 

ディスパッチャーがまだ存在しない場合、アクセスするCurrentDispatcherと、WPF ウィンドウでも使用されるシングルトン ディスパッチャーが自動的に作成されます。

于 2012-05-30T10:21:21.030 に答える