マルチキャスト デリゲートで例外を処理する最良の方法は何ですか?
私の質問は、マルチキャスト デリゲートの実行でメソッドが例外をスローするとどうなるかということです。止まりますか?継続する ?処理する方法 ?誰かが共有してくれれば、説明付きの小さなプログラムは本当に役に立ちます....ありがとう....
例外はすぐに伝播され、デリゲートの呼び出しリスト内の「後の」アクションは実行されません。すべてのデリゲートを確実に実行したい場合(たとえば、すべての例外をまとめて集約したい場合)、呼び出しDelegate.GetInvocationList
て、それらの各デリゲートを元のデリゲートと同じタイプにキャストし、それらを1つずつ呼び出してキャッチする必要があります。スローされたときの例外。
これを行うサンプルコードを次に示します。これをより一般的な方法で行うと便利です。理想的には、(実行されると)すべての構成デリゲートを実行して例外を集約する新しいデリゲートを構築します...しかしこれは始まりです。
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);
}
}
}
他の例外と同じように機能し、マルチキャストされていないデリゲートと同じように機能します。例外はスタックに伝播します。