3

我正在尝试捕获将由 Task.Factory.StartNew 方法抛出的 NullReferenceException。我认为它应该被带有 task.Wait() 方法的'try'语句捕获。我也提到了为什么这个异常没有被捕获?,但不知道。你愿意分享你的智慧吗?

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();
        }
    }
}
4

2 回答 2

2

这种行为是由于 VS 的调试器而不是您的代码造成的。

如果您处于调试模式并启用了“仅我的代码”(这是大多数语言的默认设置),则将其关闭应该可以解决问题。

要禁用“仅我的代码”功能,请转到“工具”>“选项”>“调试”>“常规”,然后取消选中“仅我的代码”复选框。

如果您想知道启用 Just My Code 功能有什么作用,这里是msdn的摘录。

仅启用我的代码
启用此功能后,调试器仅显示并进入用户代码(“我的代码”),忽略系统代码和其他经过优化或没有调试符号的代码。

于 2017-08-22T07:07:54.443 回答
1

如果要处理任务的异常,请检查它是否出现故障。如果没有故障,则继续执行。

   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;这种情况下是无效的,因为方法没有返回类型。

于 2017-04-20T23:12:01.553 回答