7

我正在尝试运行以下代码:

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);
        }

但这并没有发生。为什么会这样?

4

5 回答 5

10

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

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

如果您将代码更改为:

try
{
    task.Wait();
}

...然后我希望它能够捕获异常。

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

于 2013-05-14T17:08:28.790 回答
1

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

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

以下代码:

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

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

于 2013-05-14T17:10:23.533 回答
-1

您必须将 Visual Studio 配置为接受异常,即使这些异常不是您生成的 https://www.youtube.com/watch?v=UgJcISLX8BI

于 2020-09-16T15:19:01.117 回答
-2

AggregateException 和 ApplicationException 都是同一个类 System.Exception 的子级。AggregateException is-not a ApplicationException

于 2013-05-14T17:14:14.043 回答
-4

因为您的语句不在 try 中,但在它之前... catch 将捕获 try 大括号内的每个异常...

于 2013-05-14T17:06:37.113 回答