2015-11-25 13 views
5

「プログラムが動作していません」というダイアログを表示しないように、in this postを読んだところ、AppDomainから未処理の例外をキャッチする必要があります。未処理の例外をキャッチしても「プログラムが動作していません」ダイアログが表示される

public Form1() 
{ 
    ///Code 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    ///more code 
} 

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     var excep = e.ExceptionObject; 

     //Writing the exception to log file with the stack flow 
     Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this); 

     //Terminate the logger (manual event waiting for file write to finish) 
     Logger.Logger.Terminate(); 
     Environment.Exit(1); 
    } 

しかし、私は吸入の例外を得る。私はそれがログに書かれているのを見ることができますが、アプリケーションは「プログラムが動作していません」というダイアログを表示します。 これはLogger.Terminate行によって引き起こされる可能性がありますか? (また、terminateコマンドは、すべてのログがログファイルに書き込まれるまで待機します)

+1

イベントハンドラもクラッシュする可能性があります。 Terminate()メソッドはかなり危険に思えます。 Environment.Exit()でも失敗する可能性がありますが、ファイナライザはまだ実行されています。または、Loggerクラスのバグのような愚かなものは、イベントハンドラで使用すると良くなりません。一般的に、あなたのプログラムでは何か面倒なことが起こったので、イベントハンドラを不安定にする可能性は決してゼロにはなりません。イベントをかなり遅く購読しているので、他の作業をする前にMain()メソッドで行う必要があります。 –

+0

イベントハンドラが呼び出されないこともあります。いくつかの例外( 'StackOverflowException')は、ハンドラが実行される前にプロセス全体を停止させることができます。 – hvd

+0

Guys-ログファイルで未処理の例外が表示され、ログファイルのfinilizingも表示されます。このイベントは処理されます。また、私は主な同じイベントがスレッドの例外をキャッチしている(ありがとう!) – Izikon

答えて

0

「プログラムが動作していません」という条件を避けたい場合は理想的には、まずはそうでない場合は、単にエラーをログに記録してプログラムを正常終了させたい場合は、プログラムを正常に終了させる必要があります。

Environment.Exit(1)でプログラムを終了すると、正常に終了するとは逆に、オペレーティングシステムに「やあ、私は盗んだ!」と言っているでしょう。 0のコードで終了し、何か違いがあるかどうか確認してください。

関連する問題