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; в этом случае недопустим, так как метод не имеет возвращаемого типа.

Другие вопросы по тегам