在C#中引发事件,忽略处理程序引发的异常

Fly*_*179 9 c# events exception

我在C#中引发事件的一个小问题是事件处理程序中的异常会破坏我的代码,并且可能会阻止其他处理程序被调用,如果破坏的那个正好先被调用; 在大多数情况下,如果正在侦听其事件的其他人的代码被破坏,我的代码就不会在意.

我创建了一个捕获异常的扩展方法:

public static void Raise(this EventHandler eh, object sender, EventArgs e)
{
  if (eh == null)
    return;
  try
  {
    eh(sender, e);
  }
  catch { }
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实意味着我的代码仍然存在,但是这种方法不会阻止第一个事件处理程序抛出异常并阻止第二个和后续处理程序被通知该事件.我正在研究迭代GetInvocationList以将每个单独的事件处理程序包装在它自己的try/catch中的方法,但这似乎效率低下,而且我不确定最好的方法,或者即使我应该这样做.

另外,我真的很不舒服,只是忽略了这里的例外(并且没有FxCop/Resharper); 实际上,在这种情况下,例外应该发生什么?

Cha*_*ion 4

如果你做了这样的事怎么办?

public static void Raise(this EventHandler eh, object sender, EventArgs e)
{
    if (eh == null)
        return;

    foreach(var handler in eh.GetInvocationList().Cast<EventHandler>())
    {
        try
        {
            handler(sender, e);
        }
        catch { }
    }
}
Run Code Online (Sandbox Code Playgroud)