UnhandledExceptionを処理した後、アプリケーションが未知/ロック状態に入る

私のApp.xaml.csには、DispatcherUnhandledExceptions(UIスレッド)とUnhandledException(非UIスレッド)を処理するイベントがあります。 Dispatcher.Invokeの内部で例外をスローすると、dispatcherhandlerは例外を捕捉して処理します。例外を記録した後、e.Handledをtrueに設定しています。今、異常な振る舞い、私は例外を投げるdispatcher.Invokeのregualr statmentとして、コントロールは、ディスパッチャーの例外ハンドラに送信されますが、メソッドが処理された後、基本的にコントロールが失われますが、私はまだvsの停止ボタンで

もう一つ、e.handledをfalseに設定した場合、制御は非UIスレッド例外ハンドラに送られます。

だから私が困惑しているのは、ディスパッチャーハンドラで例外を処理した後にアプリケーションがロックされる理由です。

ここに私のコードです

    private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
      //log exception here
        e.Handled = true; 
    }//control is lost after executing this block

    private void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            Exception ex = e.ExceptionObject as Exception;                
           //log exception here
        }
        finally
        {
            Environment.Exit(-1);
        }

    }
1

2 答え

UnhandledExceptionは、アプリケーションが事実上停止していることを意味します。そのイベントを取得した場合は、シナリオから復旧するために何かを行うのは時期尚早です。通常、このイベントはデバッグの目的でエラーをログに記録し、管理されていないリソースをクリーンアップしようとする場合にのみ使用します。

次の記事では、WPFでの例外処理の詳細について説明しています。

1
追加された
ウィンドウコンストラクタから例外をスローすることはお勧めしません。代わりに、あなたのロジックを代わりにInitializedまたはLoadedイベントに入れ、ウィンドウとして自分自身を殺す。
追加された 著者 Phil Wright,
しかし、なぜe.handled = trueを実行した後、アプリケーションは植物状態に入るのでしょうか?私のウィンドウのコンストラクタでは、私は例外をスローしています、新しい例外をスローします( "何らかの例外")。コントロールはdispatcherUnhandledExceptionハンドラに送られますが、アプリはまだ実行し続けます。
追加された 著者 Syler,

OnStartupイベントの後に例外が発生した場合、例外が発生した場合、例外がキャッチされて処理されますが、メインウィンドウは表示されませんが、デバッガはそのアプリケーションが実行中であることを示します。

私が見つけた最も近い解決策は、メインウィンドウのコンストラクタから複雑なロジックを削除して、onstartupイベントを実行し、MainWindowロードイベントで多くのロードを実行できるようにすることです。

0
追加された