私は軽量のWPF MVVMフレームワークを開発しており、未処理の例外をキャッチして理想的にはそれらから回復できるようにしたいと考えています。私はApp.xaml.csのOnStartupメソッド内AppDomain.CurrentDomain.UnhandledExceptionのためのハンドラを登録した場合フレームワークレベルでWPFの例外をキャッチ
、:一瞬のためにこれをやっていないため、すべての良い引数を無視
は、私は次のような状況が発生しました次のように...
App.xaml.cs:予想通り
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += new
UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);
base.OnStartup(e);
}
void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}
、その後は私のVMのの1つに例外を発生させ、ハンドラが呼び出されます。
これまでのところ、このアプローチを使用して回復できる方法がないという点を除いて、私ができることは例外を記録し、CLRにアプリケーションを終了させることだけです。
私が実際にやりたかったのは、回復してメインのフレームワークVMに制御を戻すことでした。 (これをやることに対する動機を別にしておく)。
ので、いくつかの読書をして、私はコードは今、このようなものを見えるように問題がある
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);
this.DispatcherUnhandledException +=
new DispatcherUnhandledExceptionEventHandler(DispatcherUnhandledExceptionHandler);
base.OnStartup(e);
}
void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}
void DispatcherUnhandledExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs args)
{
args.Handled = true;
// implement recovery
}
...、同じ場所にAppDomain.CurrentDomain.UnhandledExceptionのイベントハンドラを登録することを決定します一度私はthis.DispatcherUnhandledExceptionのハンドラを登録すると、イベントハンドラは呼び出されません。したがって、DispatcherUnhandledExceptionHandlerを登録すると、何らかの理由でAppDomain.CurrentDomain.UnhandledExceptionのハンドラーが非アクティブになります。
処理されていないVM例外を捕捉して回復する方法はありますか?
フレームワークにスレッドを明示的に使用することはありません。
ありがとうIsak、私が生成する可能性が高いすべての例外をキャッチすることを知っておくことが重要です。 –