zoukankan      html  css  js  c++  java
  • 转载C#委托之多播委托( 二)

    通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止

    示例如下: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

  • 相关阅读:
    Swift8-枚举Enumerations
    Swift7-闭包
    Swift6-函数
    Swift5-控制流
    Swift4-集合类型
    什么是node.js
    nodejs的安装
    环境变量的认识,,,
    shell是什么,各种shell的初步认识,适用于初学者
    exports和module.exports的区别
  • 原文地址:https://www.cnblogs.com/akingyao/p/2843737.html
Copyright © 2011-2022 走看看