我有一个类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线程,外部try / catch不是一个选项。所以我要抓住Exception
内的ConnectionHanlder
和......?
从我的IOManager中登录{@ 1}}的最佳选择是什么?
谢谢,
答案 0 :(得分:2)
最好的办法是实际抓住的刺激。使用预期的异常处理来编排应用程序工作流是您通常在IO交互中执行的操作,通常没有其他方法可以正确处理。
所以只需在ConnectionHandler
中使用try/catch/throw
序列处理它。
可能是,不要一次引发异常,而只是处理它。
答案 1 :(得分:0)
事件通常不允许逃避任何不如CpuOnFireException
严重的异常。如果事件表示可能成功或可能未成功的操作,并且其失败需要中继到调用代码,则事件处理程序应捕获所有不太严重的异常并通过“event arguments”参数传递有关它们的信息。当然,这会产生代码提升事件的义务,以检查是否发生了异常;它还可能会在事件处理程序方面产生义务,以检查先前处理程序中的问题是否应该导致事件处理程序忽略当前事件。
虽然使用MulticastDelegate
处理事件订阅看起来简单易行,但处理MulticastDelegate
的一部分时发生的异常将导致跳过其他部分;在许多情况下,事件被跳过可能会将原本可恢复的异常变为不可恢复的异常(例如,如果更新通知获得,则应该保持更新的两个集合以便彼此匹配可能会失去同步跳过)。虽然可以将MulticastDelegate
分解为方法指针和目标列表,但使用其他数据类型(如EventHandler<T>[]
)来保存事件列表并且不打扰制作任何多播委托会更容易。