我有一个类可以触发事件委托给编组为DispatcherObject
的目标,但是我遇到问题,如果处理程序在它的事件代码中引发异常,我应该怎么做?我不想阻止其他听众处理该事件。我正在寻找如何处理这样的问题的建议。关于处理多线程事件中的异常的建议
给出一个抽象基类与Saved
事件,我的模式是如下:
public event EventHandler<EventArgs> Saved;
public void Save() {
try {
OnSave();
} catch (Exception) {
// What should I do here? throwing prevents subsequent handlers,
// while catching gobbles up the exception. Should this be in OnSave()?
}
}
protected virtual void OnSave() {
EventHandler<EventArgs> evt = Saved;
if (evt != null) {
var args = EventArgs.Empty;
foreach (var handler in evt.GetInvocationList()) {
var target = handler.Target as DispatcherObject;
if (target == null || target.CheckAccess()) {
var h = handler as EventHandler<EventArgs>;
if (h != null) h(this, args);
} else {
target.Dispatcher.Invoke(handler, this, args);
}
}
}
}
我想过建设一个拥有像ArrayException
什么的所有异常的异常,但是这并未” t看起来没错。
建议在这里做什么将非常感激。
更新:我感谢丹尼尔和亨里克你的答案,如果我可以将两者都标记为答案,我会决定处理这个事件,因为我真的不希望它完全被忽视,我的最终解决方案如下(用于寻找解决方案的其他人)。
public event EventHandler<EventArgs> Saved;
public void Save() {
OnSave();
}
protected virtual void OnSave() {
EventHandler<EventArgs> evt = Saved;
if (evt != null) {
var args = EventArgs.Empty;
var handlers = evt.GetInvocationList();
var exceptions = new Queue<Exception>(handlers.Length);
foreach (var handler in handlers) {
try {
var target = handler.Target as DispatcherObject;
if (target == null || target.CheckAccess()) {
var h = handler as EventHandler<EventArgs>;
if (h != null) h(this, args);
} else {
target.Dispatcher.Invoke(handler, this, args);
}
} catch (Exception ex) {
exceptions.Enqueue(ex);
}
}
if (exceptions.Count == 1) {
var ex = exceptions.Peek();
throw new Exception(ex.Message, ex);
}
if (exceptions.Count > 0) {
throw new AggregateException(exceptions);
}
}
}
现在,这是辉煌的,谢谢你。我发现这在.NET 4中是新的。我想我可能会喜欢在我的“On”方法中使用它。 –