6

マルチキャスト デリゲートで例外を処理する最良の方法は何ですか?

私の質問は、マルチキャスト デリゲートの実行でメソッドが例外をスローするとどうなるかということです。止まりますか?継続する ?処理する方法 ?誰かが共有してくれれば、説明付きの小さなプログラムは本当に役に立ちます....ありがとう....

4

2 に答える 2

17

例外はすぐに伝播され、デリゲートの呼び出しリスト内の「後の」アクションは実行されません。すべてのデリゲートを確実に実行したい場合(たとえば、すべての例外をまとめて集約したい場合)、呼び出し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);
        }
    }
}
于 2012-06-27T21:15:33.000 に答える
0

他の例外と同じように機能し、マルチキャストされていないデリゲートと同じように機能します。例外はスタックに伝播します。

于 2012-06-27T21:14:58.080 に答える