我正在尝试捕获一个NullReferenceException,它将由Task.Factory.StartNew方法抛出。我认为它应该通过task.Wait()方法的'try'语句来捕获。 我也提到Why is this exception not caught?,但不知道。你会分享你的智慧吗?
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();
}
}
}
答案 0 :(得分:2)
此行为是由VS的调试器而不是您的代码造成的。
如果您处于调试模式且启用了仅我的代码(这是大多数语言的默认设置),关闭它应该可以解决问题。
要停用“我的代码”功能,请转到“工具”>选项>调试>常规并取消选中“仅我的代码”复选框。
如果您想知道启用“我的代码”功能的功能,请参阅msdn的摘录。
启用我的代码 启用此功能时,调试器 仅显示和步入用户代码(“我的代码”),忽略系统 代码和其他优化或没有调试的代码 符号。
答案 1 :(得分: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;
无效,因为方法没有返回类型。