为什么没有抓住这个例外?
我正在尝试运行以下代码:
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(); }
… 然后我希望它能抓住exception。
(我之前使用的是Task
,但我注意到这是一个没有返回值的任务,所以它只是非通用的Task
。)
Task
工作方式,最终将调用传递给StartNew
的委托的代码将被捕获,并且Exception
将存储在任务的实例字段中。 可以通过查看task.Exception
属性来检查该exception。 Console.WriteLine(task)
行只是task.ToString
内部调用task.ToString
。 该方法不会导致抛出或重新抛出exception。
但是,在某些情况下,将重新抛出捕获的exception。 两个示例是访问Result
并调用Wait
,以及await
C#5.0中的任务时。
以下代码:
try { task.Wait(); } catch (AggregateException aex) { Console.Write(aex.InnerException.Message); }
将导致重新抛出存储的exception并打印exception消息。
AggregateException和ApplicationException都是同一个类System.Exception的子类。 AggregateException 不是 ApplicationException
因为你的语句不在try中,但在它之前… catch将从try花括号中捕获每个exception…