5

私はソフトウェア開発に不慣れであり、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フレームワークを使用する必要がありますか、それともこれらの例外をキャッチする他の方法はありますか?

4

3 に答える 3

2

ライブラリへのエントリポイントのセットが限られている場合は、提案したとおりに実行することを検討してください。.NETラッパークラスまたはラッパーライブラリを使用して実際の相互運用を実行し、そのラッパークラスで例外をキャッチ/ログに記録します。呼び出し元のVB6ライブラリが処理方法を知っている例外またはエラーコードを返します(例外を再スローするかどうかは、VB6コードが処理できる内容によって異なります)。

CrazyDartはIOCを提案しています。これは、興味深く有効な代替手段ですが、最初は複雑さと学習曲線を追加します。確かにIOCも見て、可能性として考えてみてください。

于 2011-07-27T19:33:43.703 に答える
1

これには、CastleWindsorと迎撃機を使用できます。プロジェクトでIOCを使用するのは当然の理由です。

http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx

あなたが述べたように、私はそれらを例外ロギングとパフォーマンスロギングに使用しました...他の多くのものの中で、同様のトランザクションにインターセプターを使用します。

于 2011-07-27T19:33:22.737 に答える
1

Spring.NETやUnityなどのAOPフレームワークの使用を検討するか、PostSharpなどの製品を検討することができます(ただし、私はPostSharpを個人的に試したことはありません)。

于 2011-07-27T20:15:24.587 に答える