2011-07-31 4 views
3

Stack Overflowのこのトピックにはかなり良いスレッドがいくつかありますが、いずれの場合でも簡潔な答えはないようです。私のC#コンソールアプリケーション(Windowsサービスとして実行中)はJavaプロセスを起動し、それを管理(起動/停止/再起動)しますが、私の問題はマシンにリモート接続され、約20のJavaプロセスが開始されることです。C#.NETですべてのクラッシュをキャッチ

これは明らかに私のアプリケーションがある時点でクラッシュし、起動したJavaプロセスをシャットダウンしないという問題です。私はAppDomain.CurrentDomainに "UnhandledExceptionEventHandler"をフックし、TerminateProcess()を呼び出して(アクティブなJavaプロセスをシャットダウンします)、この問題はまだ発生しています。

私のアプリケーションには、メインスレッド、TCPサーバースレッド(非同期接続を受け付ける)、およびUDPサーバースレッドがあります。 UnhandledExceptionの上にフックする必要があるものはありますか?

また、ちょうど私は単に私が見たことがないこれは、コンソールへの書き込み私のコードでは、いくつかのtry/catchブロックを持っていることを私に発生した

EDIT。私はこれらを削除してUnhandledExceptionに捕まえるか、代わりにそこにロガーを追加する必要がありますか?

+0

これはa)Winformsアプリ、b)WPFアプリ、c)コンソールアプリ、d)ASP.NETウェブアプリですか?例外処理(「グローバル」スコープ上)は、これらのタイプ間でかなり異なっています。つまり、どちらが重要かを知ることです。 –

+4

Re:あなたの編集 - 一般的なアドバイスは次のとおりです。例外から回復できない場合は、それをバブルアップするか、ログに記録して再スローします。例外を飲み込まないで、実際には例外を処理しないcatchブロックは書き込まないでください。 –

+0

コンソールアプリケーションがサービスとして実行されています。申し訳ありません。 –

答えて

1

まず、ログに記録したくないコードの行をDebug.WriteLine..に変更する必要があります。その出力はデバッグのみになります。

2回目の対処方法や修正方法がわからない場合に例外が発生した場合は、ログ後にcatch { throw; }を再送信してください。私は個人的にDomainUnhandledExceptionがスローされた時はいつでも今、あなたは、あなたがあなたのアプリケーションを再起動することができ、あなたはあなたのコードをクリーンアップした後

try 
{ 
    ... 
} 
catch (Exception exception) 
{ 
    Log(exceptiosn);//log it first or Debug.WriteLine... 
#if DEBUG 
    System.Diagnostics.Debugger.Break();//break at the debugger here. 
#endif//DEBUG 
    throw; 
} 

を行います。例はhereになります。アプリケーションから新しいインスタンスを開始し、最初のインスタンスを終了するという考え方です。ミューテックスを定義することで、時には1つのインスタンスだけが生きています。

0

.NETアプリケーションが生成されたプロセスを担当するかどうかを検討する必要があります。可能であれば、入力を受け取らなくなったときにシャットダウンを行う可能性があります。生成されたプロセスが他のマシンで実行されている場合は、ネットワークの問題が.NETアプリケーションからJavaプロセスへのシャットダウンメッセージの送信を妨げる可能性があるため、これを実行しようとします。それぞれの責任。

つまり、.NETアプリケーションで例外処理を取得することは(特にいくつかの例外がない場合は)重要です。各スレッドがその例外を処理するようにし、簡単にデバッグできるようにログを記録するようにしてください。

関連する問題