为什么这个异常没有被捕获?
我试图运行下面的代码:
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?