如何在C#中处理多播委托中的exception?
我已经获得了一些我通过多播委托调用的代码。
我想知道如何能够赶上并管理那里提出的任何exception,而目前还没有进行管理。 我无法修改给出的代码。
我一直在环顾四周,发现需要调用GetInvocationList(),但不确定这是否有用。
考虑使用GetInvocationList
的代码:
foreach (var handler in theEvent.GetInvocationList().Cast()) { // handler is then of the TheEventHandler type try { handler(sender, ...); } catch (Exception ex) { // uck } }
这是我的旧方法,我更喜欢的新方法是因为它使调用变得轻而易举,包括使用out / ref参数(如果需要)。
foreach (var singleDelegate in theEvent.GetInvocationList()) { try { singleDelgate.DynamicInvoke(new object[] { sender, eventArg }); } catch (Exception ex) { // uck } }
它单独调用每个将被调用的委托
theEvent.Invoke(sender, eventArg)
快乐的编码。
在处理事件时,请记住执行标准的空值保护copy’n’check(也许是锁定)。
您可以循环遍历多播列表中注册的所有委托,并在try-catch块中包含每个调用时依次调用每个委托。
否则,将在具有exception的委托之后对多播中的后续委托的调用将被中止。
upvoted答案是针对事件的,代表们专门尝试这种扩展方法:
public static class DelegateExtensions { public static void SafeInvoke(this Delegate del,params object[] args) { foreach (var handler in del.GetInvocationList()) { try { handler.Method.Invoke(handler.Target, args); } catch (Exception ex) { // ignored } } } }