从事件中捕获异常

时间:2012-12-03 14:22:10

标签: c# exception dependencies

我有一个类TCPDataLink使用Socket实现一些TCP功能。我还有一个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
}

根据this线程,外部t​​ry / catch不是一个选项。所以我要抓住Exception内的ConnectionHanlder和......?

从我的IOManager中登录{@ 1}}的最佳选择是什么?

谢谢,

2 个答案:

答案 0 :(得分:2)

最好的办法是实际抓住的刺激。使用预期的异常处理来编排应用程序工作流是您通常在IO交互中执行的操作,通常没有其他方法可以正确处理。

所以只需在ConnectionHandler中使用try/catch/throw序列处理它。 可能是,不要一次引发异常,而只是处理它

答案 1 :(得分:0)

事件通常不允许逃避任何不如CpuOnFireException严重的异常。如果事件表示可能成功或可能未成功的操作,并且其失败需要中继到调用代码,则事件处理程序应捕获所有不太严重的异常并通过“event arguments”参数传递有关它们的信息。当然,这会产生代码提升事件的义务,以检查是否发生了异常;它还可能会在事件处理程序方面产生义务,以检查先前处理程序中的问题是否应该导致事件处理程序忽略当前事件。

虽然使用MulticastDelegate处理事件订阅看起来简单易行,但处理MulticastDelegate的一部分时发生的异常将导致跳过其他部分;在许多情况下,事件被跳过可能会将原本可恢复的异常变为不可恢复的异常(例如,如果更新通知获得,则应该保持更新的两个集合以便彼此匹配可能会失去同步跳过)。虽然可以将MulticastDelegate分解为方法指针和目标列表,但使用其他数据类型(如EventHandler<T>[])来保存事件列表并且不打扰制作任何多播委托会更容易。