【发布时间】:2010-06-24 20:59:03
【问题描述】:
我对在 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 也不是);实际上,在这种情况下,异常应该发生什么?
【问题讨论】:
-
我经常想知道处理这个问题的最佳方法是什么。
-
这实际上提出了另一个问题,我将单独提出;在这个问题中,我从引发事件的类的角度进行编码,但我想知道是否应该首先允许事件处理程序抛出异常。 stackoverflow.com/questions/3114543/…