【问题标题】:AggregateException not caught by Task.Wait()Task.Wait() 未捕获 AggregateException
【发布时间】:2017-08-22 15:07:54
【问题描述】:

我正在尝试捕获将由 Task.Factory.StartNew 方法抛出的 NullReferenceException。我认为它应该被带有 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();
        }
    }
}

【问题讨论】:

    标签: c# task wait aggregateexception


    【解决方案1】:

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

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

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

    如果您想知道启用“仅我的代码”功能有什么作用,这里是msdn 的摘录。

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

    【讨论】:

    • 谢谢。实际上,我在 3 个月前在下面发表评论时自己找到了答案。但我找不到解决问题的方法。所以我把你的标记为那个。祝你有美好的一天!
    【解决方案2】:

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

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

    【讨论】:

    • 你好。感谢您的解决方案。这是有道理的,但是还有其他方法可以处理异常吗?就像使用常规的异常处理语句一样。我也指MSDN,但它也可以用Task.wait()捕获异常。
    • 从上面继续,我也尝试了你的解决方案,但仍然得到同样的异常说“未处理”,而且看起来代码没有处理异常。
    • 在处理任务时,您必须检查状态是否出现故障,并且上面的代码可以正常工作。你有完整的代码吗?
    • @Simons/ 感谢您的帮助。以上是一个完整的代码。我在具有 2 个不同环境的 2 台 PC 上测试了该代码。 /VS2010 + .NET 4.0 / VS2015 + .NET4.6 /
    • 找到的解决方案:stackoverflow.com/questions/19865523/…我正在结束这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2018-12-21
    • 2010-09-28
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多