AggregateException
AggregateException часто появляется у
задач: вызов Wait() или Result
у Task с ошибкой прячет исходный сбой
внутри агрегата. При await то же
исключение пробрасывают напрямую, без обёртки.
Список сбоев смотрят в
InnerExceptions.
Синтаксис
try
{
Task.Run(() => throw new Exception()).Wait();
}
catch (AggregateException)
{
}
Пример
Давайте поймаем AggregateException от
Wait():
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
try
{
Task.Run(() =>
{
throw new InvalidOperationException("abcde");
}).Wait();
}
catch (AggregateException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Пример
Давайте прочитаем сообщение первого вложенного сбоя:
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
try
{
Task.Run(() =>
{
throw new InvalidOperationException("abcde");
}).Wait();
}
catch (AggregateException ex)
{
Console.WriteLine(ex.InnerExceptions[0].Message);
}
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте создадим агрегат из двух исключений вручную:
using System;
class Program
{
static void Main()
{
var ex = new AggregateException(
new InvalidOperationException("abcde"),
new InvalidOperationException("12345"));
Console.WriteLine(ex.InnerExceptions.Count);
}
}
Результат выполнения кода:
2
Смотрите также
-
InnerExceptions,
коллекция всех вложенных сбоев -
метод
Flatten,
который снимает вложенность агрегатов -
метод
Handle,
который разбирает каждый сбой -
Exception,
базовый тип исключений