通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止
示例如下:Action为无参委托
static void One() { Console.WriteLine("One"); throw new Exception(" Error in one"); } static void Two() { Console.WriteLine("Two"); } Action d1 = One; d1 += Two; try { d1(); } catch (Exception) { Console.WriteLine("Exception caught"); }
委托只调用了第一个方法,因为第一个方法抛出了一个异常,所以委托的迭代会停止,不再调用Two()方法,结果:
One
Exception caught
为了避免这个问题,应自己迭代方法列表,Delegate类定义的GetInvocationList()方法,它返回一个Delegate对象数组,现在可以使用这个委托调用与委托直接相关的方法,
捕获异常,并继续下一次迭代
Action d1 = One; d1 += Two; Delegate[] delegates = d1.GetInvocationList(); foreach (Action item in delegates) { try { item(); } catch (Exception) { Console.WriteLine("Exception caught"); } }
结果如下:
One
Exception caught
Two