捕获任务中引发的异常?

时间:2016-09-16 18:20:14

标签: c#

我试图捕捉我创建的Task内的异常,但他们从来没有“冒出来”#34;从Task运行到的地方,它们总是被Visual Studio捕获为运行时错误。

这是我创建的用于显示问题的SSCCE

using System;
using System.Threading.Tasks;

namespace ConsoleApplicationSandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            CreateTheIssue();
            Console.ReadLine();
        }

        public static async void CreateTheIssue()
        {
            try
            {
                int val = await ExceptionThrowerClass.DoSomething();
            }
            catch(Exception ex)
            {
                Console.Out.WriteLine("Exception of type " + ex.GetType() + " caught, message: " + ex.Message);
            }
        }
    }

    public static class ExceptionThrowerClass
    {
        public static Task<int> DoSomething()
        {
            return Task.Run(() =>
            {
                throw new FooException("How exceptional!");
                return 1;
            });
        }
    }

    public class FooException : Exception
    {
        public FooException() : base () { }
        public FooException(String message) : base(message) { }
        public FooException(String message, Exception inner) : base (message, inner) { }
    }
}

Visual Studio在FooExcepionDoSomething抛出异常未被捕获时通知我。从this SO answerthis MSDN page开始,我认为例外只会“冒出来”#34;到myTask.Wait()并随后被抓住。虽然这似乎不是那种情况。

此SCCEE的项目设置针对的是.NET 4.5.2,我使用的是Visual Studio 2015.是否我的目标.NET框架无法以这种方式捕获异常?如何在FooException内的try/catch区块内抓取Main

编辑:我已将SSCCE更改为使用async / await模式而不是Task.Wait

1 个答案:

答案 0 :(得分:2)

点击Continue按钮,您将看到异常确实被外部try / catch捕获。因为异常交叉到了Task的内部,所以例外情况被认为是&#34;用户无需使用#34;但Task通过将任务放入Faulted来为您解决问题州。当您await.Wait()任务时,这将是一个例外。

在编辑之前使用原始方法

    try
    {
        myTask.Wait();
    }
    catch(AggregateException ex)
    {
        var innerException = ex.InnerException;
        Console.Out.WriteLine("Exception of type " + innerException .GetType() + " caught, message: " + innerException.Message);
    }

因为Task会将异常包装到AggregateException,当你使用await时,它会为你解开异常。