我想了解在多播代表中处理异常的最佳方法是什么?
我的问题是,如果方法在多播委托执行中抛出异常会发生什么?它会停止吗?继续 ?如何处理 ?如果有人可以分享,一个带有解释的小程序将非常有帮助....谢谢....
异常将立即传播,并且委托的调用列表中的任何“稍后”操作都不会被执行。如果您想确保执行所有委托 - 例如,可能将所有异常聚合在一起 - 您需要调用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);
}
}
}
它将像任何其他异常一样工作,并且将与非多播委托一样工作:异常向上传播堆栈。