AggregateException не перехвачено Task.Wait()
Я пытаюсь поймать исключение NullReferenceException, которое будет выдано методом Task.Factory.StartNew. Я думаю, что это должно быть перехвачено оператором try с помощью метода task.Wait(). Я также сослался на Почему это исключение не поймано?, но понятия не имею. Вы бы поделились своей мудростью?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace Csharp_study
{
class Program
{
static void Main(string[] args)
{
Task my_task = Task.Factory.StartNew(() => { throw null; });
try
{
my_task.Wait();
}
catch (AggregateException exc)
{
exc.Handle((x) =>
{
Console.WriteLine(exc.InnerException.Message);
return true;
});
}
Console.ReadLine();
}
}
}
2 ответа
Такое поведение связано с отладчиком VS, а не с вашим кодом.
Если вы находитесь в режиме отладки и у вас включен Just My Code (который является настройкой по умолчанию для большинства языков), отключите его.
Чтобы отключить функцию "Просто мой код", перейдите в "Инструменты"> "Параметры"> "Отладка"> "Общие" и снимите флажок "Просто мой код".
Если вам интересно, что делает функция Just My Code, вот выдержка из msdn.
Включить только мой код
Когда эта функция включена, отладчик отображает и входит только в код пользователя ("Мой код"), игнорируя системный код и другой код, который оптимизирован или не имеет символов отладки.
Если вы хотите обработать исключение для задачи, проверьте, не сработало ли оно. Если это не так, продолжайте выполнение.
static void Main(string[] args)
{
Task my_task = Task.Factory.StartNew(() => { throw null; });
my_task.ContinueWith(x =>
{
if (my_task.IsFaulted)
{
Console.WriteLine(my_task.Exception.Message);
}
else {
//Continue with Execution
}
});
}
И return true;
в этом случае недопустим, так как метод не имеет возвращаемого типа.