1

TCPDataLinkを使用していくつかの TCP 機能を実装するクラスがありますSocketIOManagerエラーがスローされたときにログを記録するもあります (すべての でDataLink)。

問題は、クラスSocketからイベント ハンドラーの例外をキャッチする方法が見つからないことです。すべてのクラスでログ記録コードを繰り返したくないので、クラス内に依存関係IOManagerを注入したくありません。LoggerTCPDataLinkDataLink

通常の場合の例:

// IOManager Class call in a normal case
try
{
  tcpInstance.DoSomething
}
catch (MyCustomEx e)
{
  // Log the problem
  Logger.log(e.ToString());
}

私の問題のあるケースでは:

// TCPDataLink.cs
...
socket.OnConnection += ConnectionHandler // Cannot try/catch or whatever
...

void ConnectionHandler(...)
{
  // Code throwing Exceptions
}

このスレッドによると、外部の try/catch はオプションではありません。だから私は私Exceptionの中にキャッチしなければConnectionHanlderなりません... ?

キャッチする可能性を除いて、IOManager からログに記録するための最良の代替手段は何Exception ですか?

ありがとう、

4

2 に答える 2

2

最良の方法は、実際に例外をキャッチすることです。予期される例外処理を使用してアプリのワークフローを調整することは、IO インタラクションで通常行うことですが、多くの場合、それを正しく処理する方法は他にありません。

したがってConnectionHandler、いくつかのtry/catch/throwシーケンスを使用して処理してください。おそらく、例外がキャッチされたら例外を発生させず、処理するだけです。

于 2012-12-03T14:26:32.557 に答える
0

一般に、イベントでは、CpuOnFireException. イベントが、成功する可能性も失敗する可能性もあるアクションを表し、その失敗を呼び出し元のコードに中継する必要がある場合、イベント ハンドラーは重大度の低いすべての例外をキャッチし、「イベント引数」パラメーターを介してそれらに関する情報を渡す必要があります。もちろん、これにより、イベントを発生させたコードの一部に、例外が発生したかどうかを確認する義務が生じます。また、イベントハンドラー側で、前のハンドラーの問題によってイベント ハンドラーが現在のイベントを無視する必要があるかどうかを確認する義務が発生する場合もあります。

を使用MulticastDelegateしてイベント サブスクリプションを処理するのは単純で簡単に思えるかもしれませんが、 の一部の処理中に例外が発生するMulticastDelegateと、他の部分がスキップされます。多くの場合、イベントをスキップすると、回復可能な例外が回復不能な例外に変わる可能性があります (たとえば、互いに一致するように更新され続けるはずの 2 つのコレクションは、更新通知が取得された場合に同期しなくなる可能性があります)。スキップされます)。をメソッド ポインターとターゲットのリストに分解するMulticastDelegateことは可能ですが、イベント リストを保持するために のような他のデータ型を使用EventHandler<T>[]し、マルチキャスト デリゲートを作成する手間をかけない方が簡単です。

于 2012-12-03T20:26:39.457 に答える