书上说Task中未观察到的异常可在TaskScheduler.UnobservedTaskException事件中SetObserved处理。避免由CLR的终结器捕获该异常重而终止应用程序。。。
问题:我没有这样捕获并SetObserved。而且也确保没有调用过Task的Wait()、Result、Exception成员。但是我的应用程序没有被终止。。。
参考代码:
TaskScheduler.UnobservedTaskException += (s, e) => { //设置所有未觉察异常被觉察 //e.SetObserved(); }; Task.Factory.StartNew(() => { throw new Exception(); }); //确保任务完成 Thread.Sleep(100); //强制垃圾会受到 GC.Collect(); //等待终结器处理 GC.WaitForPendingFinalizers();
求高手解答下。。。
答案已经找到:http://www.cnblogs.com/TianFang/archive/2012/12/24/2831341.html
TPL中的未处理异常
由于async函数和TPL存在非常大的关联,在分析async函数异常处理方式前,首先来复习下TPL中对于异常是如何处理的,以如下代码为例:
static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
Test();
Console.ReadLine(); //等待Test任务执行完成
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadLine();
}
static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
Console.WriteLine(e.Exception);
}
public static Task Test()
{
return Task.Run(() => { throw new Exception(); });
}
执行上面代码后,我们可以发现:
从上面代码执行结果,我们可以大致了解Tpl对未处理异常的处理方式:
简单的说,TaskScheduler中处理了Task中抛出的异常,不会导致程序异常终止。老赵的Blog关于C#中async/await中的异常处理中详细描述了这一过程,感兴趣的朋友可以看看。
不过,Task中的未处理异常不会导致程序异常终止在另一方面也掩盖了代码中存在bug的隐患,因此建议注册TaskScheduler.UnobservedTaskException事件,对未处理异常记录日志,方便后续跟踪分析。
TaskScheduler.UnobservedTaskException += (s, e) => { //设置所有未觉察异常被觉察 //e.SetObserved(); };
应该是进入这段代码,异常就到此为止了
木有,未有这段代码也会终止这个异常。我 天方 一个博文中找到答案了。
@滴答的雨: 请问楼主,未有这段代码 也没有终止的原因是什么呀?望赐教