为什么没有抓到这个例外?

时间:2013-05-14 17:05:03

标签: c# multithreading task-parallel-library

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

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

但这不会发生。为什么会这样?

5 个答案:

答案 0 :(得分:10)

您只是打印出task - 它甚至还没有完成。

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

如果您将代码更改为:

try
{
    task.Wait();
}

... 然后我希望它能抓住异常。

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

答案 1 :(得分:1)

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

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

以下代码:

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

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

答案 2 :(得分:-1)

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

答案 3 :(得分:-2)

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

答案 4 :(得分:-4)

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