我已经获得了一些我通过多播委托调用的代码。
我想知道我如何能够赶上并管理那里提出的任何异常,而目前尚无法管理。我无法修改给定的代码。
我一直在环顾四周,发现需要调用GetInvocationList(),但不确定这是否有用。
答案 0 :(得分:4)
使用GetInvocationList
来考虑代码:
foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
// 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(也许是锁定)。
答案 1 :(得分:2)
您可以循环遍历多播列表中注册的所有委托,并在try-catch块中包含每个调用时依次调用每个委托。
否则,在具有异常的委托之后,多播中后续委托的调用将被中止。
答案 2 :(得分:0)
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
}
}
}
}