在C#中,引发事件时我最讨厌的事情之一是,如果事件处理程序中出现异常,会破坏我的代码,并可能阻止其他处理程序被调用,如果先调用的是已经崩溃的处理程序;在大多数情况下,我的代码并不关心正在侦听其事件的其他人的代码是否崩溃。
我创建了一个捕获异常的扩展方法:
public static void Raise(this EventHandler eh, object sender, EventArgs e)
{
if (eh == null)
return;
try
{
eh(sender, e);
}
catch { }
}
虽然这意味着我的代码将继续执行,但此方法无法阻止第一个事件处理程序引发异常并防止通知事件的第二个及后续处理程序。我正在研究一种通过迭代GetInvocationList来包装每个单独的事件处理程序以进行其自己的try/catch的方法,但这似乎效率低下,而且我不确定最佳方法是什么,甚至不确定是否应该这样做。此外,我真的不舒服简单地忽略这个异常(FxCop/Resharper也是如此); 实际上在这种情况下应该发生什么事情?