3

.Net/c# 2.0 Windows サービスがあります。エントリ ポイントは、問題を通知し、サービスが正常に動作し続けることを可能にする try catch ブロックにラップされていますが、サーバーのアプリケーション イベント ログを見ると、サービスが停止する原因となっている多数の「EventType clr20r3」エラーが表示されます。予想外。catch ブロックには「catch (Exception ex)」があり、例外を再スローしません。

各 SQL コマンドは「CommandType.StoredProcedure」タイプであり、SqlDataReader で実行されます。これらの sproc 呼び出しは 99% の確率で正しく機能し、すべて徹底的に単体テスト、プロファイリング、および QA が行われています。念のため、これらの呼び出しを try catch ブロックでさらにラップしましたが、まだこれらの未処理の例外が発生しています。

これは本番環境のみであり、開発環境またはステージング環境では複製できません (負荷が高い場合でも)。

エラー処理でこの特定のエラーがキャッチされないのはなぜですか? 問題の根本原因について詳細を把握する方法はありますか?

イベント ログの例を次に示します。

EventType clr20r3, P1 RDC.OrderProcessorService, 
P2 1.0.0.0, 
P3 4ae6a0d0, 
P4 system.data, 
P5 2.0.0.0, P6 4889deaf, 
P7 2490, 
P8 2c, 
P9 system.data.sqlclient.sql, 
P10 NIL.

さらに

The Order Processor service terminated unexpectedly.  
It has done this 1 time(s).  
The following corrective action will be taken in 60000 milliseconds: 
Restart the service.
4

2 に答える 2

4

コメントからの回答。お役に立てて光栄です。:)

AppDomain.UnhandledException イベント ハンドラーを追加しようとしましたか? msdn.microsoft.com/en-us/library/… ほとんどの問題は、コードのどこかに未処理の SQL 例外があることです。

必ずしもそうとは限りませんが、使用しているコードやライブラリを見なければ、例外が別のスレッドやサードパーティのライブラリなどで発生しているかどうかを知る方法はありません... AppDomain.UnhandledException ハンドラを配線することにより、少なくとも例外の詳細をログに記録し、問題点がどこにあるかを把握できるはずです。EventArg を ((Exception)e.ExceptionObject).Message にキャストするだけで、少なくとも未処理の例外がどこにあるかをよりよく理解できるはずです。

于 2010-04-29T19:37:15.517 に答える
1

このエラーは、エントリ ポイント以外のスレッドで発生している可能性があります。

バックグラウンド スレッドの例外処理も何らかの方法で定義する必要があります。

WCF を使用してサービスをラップしている場合は、障害やその他の例外の処理方法を定義できます。これがあなたのサービスをホストしている方法ですか?

編集:非同期的に何も生成しておらず、WCF/etc アプリではない場合は、AppDomain.UnhandledException を処理し、そこに詳細なエラーを記録してみてください。

于 2010-04-29T16:46:18.437 に答える