並列処理、非同期処理で出力される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を返した場合は再スローされます。
コメント