任务基础结构会将内部异常包装在 AggregateException 实例中。 AggregateException 具有一个 InnerExceptions 属性,可枚举该属性来检查引发的所有原始异常,并单独处理(或不处理)每个异常。 即使只引发了一个异常,也仍会将该异常包装在 AggregateException 中。

 

 
  1. var task1 = Task.Factory.StartNew(() =>  
  2. {  
  3.     throw new Exception("I'm bad, but not too bad!");  
  4. });  
  5.  
  6. try 
  7. {  
  8.     task1.Wait();  
  9. }  
  10. catch (AggregateException ae)  
  11. {  
  12.     foreach (var a in ae.InnerExceptions)  
  13.     {  
  14.         Console.WriteLine(task1.IsFaulted); //这里将输出True,表示task1任务失败了  
  15.         Console.WriteLine(a.Message);  
  16.     }  
  17. }  
  18. Console.Read();  

输出:

True
I'm bad, but not too bad!
当运行到throw new Exception("I'm bad, but not too bad!");的时候,VS会在这行中断运行,并显示错误消息,这是没关系的,按F5继续查看后续操作。
MSDN原文:
当启用“仅我的代码”时,在某些情况下,Visual Studio 将在引发异常的行上中断运行,并显示错误消息“异常未由用户代码处理”。此错误是良性的。 按 F5 继续并查看在这些示例中演示的异常处理行为。 若要阻止 Visual Studio 在出现第一个错误时中断运行,只需在“工具”->“选项”->“调试”->“常规”下取消选中“仅我的代码”复选框即可。