AggregateException(C# WPF)

C#

並列処理、非同期処理で出力されるExceptionです。
端的に言えばTask.RunとかParalell.とかを使う場合に出てきます。

なんでこんなものがあるのかというと、非同期処理で発生する例外は1つとは限らず複数になる可能性があるからです。
AggregationExceptionはそれぞれのスレッドで発生したExceptionをまとめるCollectionのようなものです。

try 
{
    Parallel.For(0, 10, (i) => {
        throw new InvalidOperationException();
    });
}
catch(AggregateException e) {
}

Parallel.ForでもTask.RunでもAggregateExceptionが発生します。
AggregateExceptionはCollectionのようなものですから、内部に格納してあるエラーにアクセスするにはInnerExceptionプロパティを利用します。

catch (AggregateException ae) when (ae.InnerExceptions.Any(ex => ex is HandledException))
{
    if (ae.InnerExceptions.FirstOrDefault(ex => ex is HandledException) is HandledException e)
    {
        Console.WriteLine(e.Message);
    }
}

これはあまりいい例ではありませんね。
せっかくAggregateExceptionで複数取得しているのにその内の1つしか使っていません。

全てのエラーに対して処理を行う場合はHandleメソッドを用いた方が良さそうです。

catch (AggregateException ex) when (ex.InnerExceptions.Any(e => e is HandledException))
{
    ex.Handle(e => {
        if(e is HandledException)
        {
            Console.WriteLine(e.Message);
            return true;
        }
        else
        {
            return false;
        }
    })
}

Handle()でfalseを返した場合は再スローされます。

C#
スポンサーリンク
Once and Only

コメント