在Multicast Delegate中的方法中发生异常时会发生什么

时间:2012-06-27 21:10:58

标签: c# .net

我想了解在多播代理中处理异常的最佳方法是什么?

我的问题是,如果方法在多播委托执行中抛出异常会发生什么?它会停止吗?继续?如何处理 ?如果有人可以分享,那么带有解释的小程序将非常有用....谢谢....

2 个答案:

答案 0 :(得分:14)

异常将立即传播,并且委托调用列表中的任何“稍后”操作都将执行。如果您想确保执行 all 代理 - 例如,可能将所有异常聚合在一起 - 您需要调用Delegate.GetInvocationList,将每个代理强制转换为相同的类型作为原文,并逐个调用它们,捕获它们被抛出时的异常。

这里有一些示例代码可以做到这一点 - 以更通用的方式执行此操作会很好,理想情况下构建一个新的委托(执行时)将执行所有组成委托并聚合异常......但是这样是一个开始。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    public static void Main()
    {
        Action x = null;
        x += () => Console.WriteLine("First");
        x += () => { throw new Exception("Bang 1"); };
        x += () => { throw new Exception("Bang 2"); };
        x += () => Console.WriteLine("Second");

        try
        {
            ExecuteAll<Action>(x, action => action());
        }
        catch (AggregateException e)
        {
            Console.WriteLine(e);
        }
    }

    public static void ExecuteAll<T>(Delegate multi, Action<T> invoker)
    {
        List<Exception> exceptions = new List<Exception>();
        foreach (var single in multi.GetInvocationList())
        {
            try
            {
                invoker((T)(object)single);
            }
            catch (Exception e)
            {
                exceptions.Add(e);
            }
        }
        if (exceptions.Count > 0)
        {
            throw new AggregateException(exceptions);
        }
    }
}

答案 1 :(得分:0)

它将像任何其他异常一样工作,它将与非多播委托一样工作:异常传播到堆栈中。