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

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

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.Result ,但我注意到这是一个没有返回值的任务,所以它只是非通用的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…