私はソフトウェア開発に不慣れであり、stackoverflowにも不慣れなので、気楽にやってください。
背景:サードパーティのアプリケーションからtcp / ipを介して(非同期ソケットを使用して)送信されたxmlメッセージを処理するC#クラスライブラリを開発しています。クラスライブラリをVb6アプリケーションに公開するためにcom-interopを使用しています。C#ライブラリがソケットを介して受信したxmlを処理すると、消費するvb6アプリケーションがサブスクライブするさまざまなイベントが発生します(このようにして、最終的に.Netでアプリケーション全体を書き直すときに、このコンポーネントはすでに完了しています)。
質問:ロギングの目的でのみ、未処理の例外をすべてキャッチしたいと思います。winformsアプリケーションでは、イベントをAppDomain.CurrentDomain.UnhandledExceptionおよびApplication.ThreadExceptionにフックできます。同様に例外データを取得して、クラスライブラリに情報を記録する方法はありませんか?
重要なポイント:
私はこれらの例外から回復しようとはしていませんが、それらをログに記録し、例外を伝播させ、必要に応じてアプリをクラッシュさせます。
特定の例外が発生する可能性があることがわかっている場合は、ローカルですべての特定の例外をキャッチするように最善を尽くしています。したがって、私の目的は、本当に予期しない例外をログに記録することです。
- これは悪いデザインパターンになると言う人もいるでしょう。代わりに、呼び出し元にこれらの例外を処理させる必要があります。問題は、vb6アプリケーションが私が望むほど堅牢なエラー処理を行っていないことです。主に、スタックトレースをログに記録して、dllが原因でvb6アプリがクラッシュした場合に、変更が必要になる可能性のあるc#コードの潜在的な領域についてアラートを受け取るためにログを表示できるようにします。
誰かが私にいくつかの方向性を提供できますか?私がこれまでに見つけた最良のオプションは、すべてのパブリックメソッドに汎用のtry catchブロックを配置し、例外をログに記録してからスローするようです。これは理想的とは言えません。
public void SomeMethod()
{
try
{
// try something here...
}
catch (Exception ex)
{
Log(ex);
throw;
}
}
これは貧弱な設計のように見えるだけでなく、非同期コールバックの1つが、メソッドが呼び出されたのとは異なるスレッドで例外を引き起こした場合にどうなるかわかりません。この一般的なtry/catchブロックはまだそのような例外をキャッチしますか?
助けてくれてありがとう。
編集:私はもともと@Eric J.の答えを正解としてマークしましたが、ソリューションを実装しようとした後、使用しているソケットクラスからの非同期コールバックではうまく機能しないことがわかりました。スレッドプールスレッドを使用して非同期コールバックを起動すると、スタックの後半で発生する例外をキャッチできないようです。AOPフレームワークを使用する必要がありますか、それともこれらの例外をキャッチする他の方法はありますか?