关于多播委托因异常而终止的解决方法

在使用多播委托时,假设方法列表中有多个方法,但委托执行到某个方法时抛出异常,那么整个委托的迭代将在抛出异常的地方退出终止。后面的方法也不会再执行。


例如:

假设定义一个包含方法的类:

SumMethod()方法输出20,然后产生一个异常;

MultiMethod ()方法输出100;

    namespace Delegates
    {
        class MethodCollection
        {
            //方法1: 该方法执行会报出异常
            static void SumMethod()
            {
                Console.WriteLine("The SumMethod ! {0}", 10 + 10);
                throw new Exception("One Error In The Method");
            }

            //方法2:
            static void MultiMethod()
            {
                Console.WriteLine("The MultiMethod ! {0}", 10 * 10);
            }
        }

    }
在主程序中定义一个多播委托,然后调用委托观察结果,主程序如下:

    namespace Delegates
    {
        class MainProgram
        {
            static void Main()
            {
                //定义一个委托
                Action multiCastDelegate;

                multiCastDelegate = MethodCollection.SumMethod;

                //叠加另外一个方法,即创建多播委托
                multiCastDelegate += MethodCollection.MultiMethod;

                //调用委托
                try
                {
                    multiCastDelegate();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    }


可看到:

当调用SumMethod()方法后,抛出异常,这使得后面的MultiMethod()方法未执行。
为了避免这种情况,即在抛出异常后依然执行后面的方法,我们做如下改进:
定义自己的迭代方法列表

由于Delegate类定义了GetInvocationList()方法,它返回Delegate对象的数组。我们可以以此建立自己的迭代方法列表,在抛出异常后继续执行后面的方法。

 namespace Delegates
    {
        class MainProgram
        {
            static void Main()
            {
                //定义一个委托
                Action multiCastDelegate;

                multiCastDelegate = MethodCollection.SumMethod;

                //叠加另外一个方法,即创建多播委托
                multiCastDelegate += MethodCollection.MultiMethod;

                //定义方法列表数组,使用GetInvocationList()
                //注意使用的是Delegate类,不是delegate关键字
                Delegate[] delegates = multiCastDelegate.GetInvocationList();

                foreach (Action d in delegates)
                {   
                    //调用委托
                    try
                    {
                        d();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值