为什么这个异常没有被捕获?

我试图运行下面的代码:

class Program
{
    static void Main(string[] args)
    {
        var task = Task.Factory.StartNew(() =>
            {
                throw new ApplicationException("message");
            });
        try
        {
            task.ContinueWith(t => Console.WriteLine("End"));
        }
        catch (AggregateException aex)
        {
            Console.Write(aex.InnerException.Message);
        }
    }
}

我预计这个Exception会被捕获到以下位置:

        catch (AggregateException aex)
        {
            Console.Write(aex.InnerException.Message);
        }

但是这没有发生。 这是为什么?


你只是打印出这个task - 甚至还没有完成。

打印任务不会等待它完成,或尝试获取值。

如果您将您的代码更改为:

try
{
    task.Wait();
}

...然后我希望它能发现异常。

(我之前使用Task<T>.Result ,但我注意到这是一个没有返回值的任务,所以它只是非通用Task 。)


Task工作方式,最终调用传递给StartNew的委托的代码将最终被捕获,并且Exception将存储在任务的实例字段中。 可以通过查看task.Exception属性来检查该异常。 行Console.WriteLine(task)只是task.ToString内部调用task.ToString 。 该方法不会导致异常被抛出或重新抛出。

但是,在某些情况下,被捕获的异常将被重新抛出。 当访问Result和调用Wait ,以及在C#5.0中await任务时,有两个示例。

以下代码:

try
{
    task.Wait();
}
catch (AggregateException aex)
{
    Console.Write(aex.InnerException.Message);
}

将导致存储的异常被重新抛出,并且将打印异常消息。


AggregateException和ApplicationException都是同一个类System.Exception的子类。 AggregateException不是ApplicationException

链接地址: http://www.djcxy.com/p/71503.html

上一篇: Why is this exception not caught?

下一篇: Is calling a lua function(as a callback) from another thread safe enough?