1

我有一个类TCPDataLink使用Socket. 我还有一个IOManager在抛出错误时(在我所有的DataLink)上进行一些日志记录的工具。

问题是我找不到从我的类中捕获Socket事件处理程序异常的方法。IOManager我不想Logger在我的类中注入依赖项,TCPDataLink因为我不想在我的所有DataLink类中重复日志记录代码。

正常情况下的示例:

// 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用于处理事件订阅看似简单易行,但在处理 a 的一部分时发生的异常MulticastDelegate会导致其他部分被跳过;在许多情况下,跳过一个事件可能会将原本可恢复的异常变成不可恢复的异常(例如,如果更新通知收到,两个本应保持更新以相互匹配的集合可能会不同步跳过)。虽然可以将 a 分解MulticastDelegate为方法指针和目标的列表,但使用其他数据类型(如 an EventHandler<T>[])来保存事件列表会更容易,而不必费心制作任何多播委托。

于 2012-12-03T20:26:39.457 回答