TimeoutException, TaskCanceledException C#
Я новичок в C# и я нахожу исключений немного запутанным... У меня есть веб-приложение со следующим кодом:
try
{
//do something
}
catch (TimeoutException t)
{
Console.WriteLine(t);
}
catch (TaskCanceledException tc)
{
Console.WriteLine(tc);
}
catch (Exception e)
{
Console.WriteLine(e);
}
когда я отлаживаю код, он бросает e Exception, самый общий, и когда я наведу курсор на информацию об исключении, оказывается, что это TaskCanceledException. Почему это TaskCanceledException поймал? Если исключение было TimeoutException поймает ли он TimeoutException или он также поймает Exception? Почему так?
1 ответов
при ловле Exception, вы должны убедиться, что это ровно создается исключение. При использовании Task.Run или Task.Factory.Startnew и вообще с участием исключения, выбрасываемого из Task (если только задача не будет ожидаться с await ключевое слово), внешним исключением, с которым вы имеете дело, является AggregateException, потому что Task единица может иметь дочерние задачи, которые могут создавать исключения.
С исключение Обработка (Параллельная Библиотека Задач):
необработанные исключения, создаваемые запущенным кодом пользователя внутри задачи распространяются обратно к соединяющему потоку, за исключением некоторые сценарии, описанные ниже в этом разделе. Исключения распространяются при использовании одной из задач static или instance.Ждать или Задача.Методы Wait, и вы обрабатываете их, заключая вызов в try-catch блока. Если задача родителя добавленные ребенка задачи, или если вы ждете нескольких задач, то несколько возможны исключения. Чтобы распространить все исключения обратно на вызывающий поток, инфраструктура задач обертывает их в AggregateException экземпляр. Исключение AggregateException имеет Свойство InnerExceptions, которое можно перечислить для проверки всех оригинальный исключения, которые были брошены, и обрабатывать (или не обрабатывать) каждый один индивидуально. Даже если выбрасывается только одно исключение, оно все еще завернутый в AggregateException.
Итак, чтобы справиться с этим, вы должны поймать AggregateException:
try
{
//do something
}
catch (TimeoutException t)
{
Console.WriteLine(t);
}
catch (TaskCanceledException tc)
{
Console.WriteLine(tc);
}
catch (AggregateException ae)
{
// This may contain multiple exceptions, which you can iterate with a foreach
foreach (var exception in ae.InnerExceptions)
{
Console.WriteLine(exception.Message);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}