我正在尝试运行以下代码:
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);
}
但这不会发生。为什么会这样?
答案 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大括号中捕获每个异常......