AggregateExpression中的C#InnerException

Hel*_*lic 7 c# aggregateexception

我有如下代码来捕获使用TaskFactory和Task.Run创建的任务抛出异常.如果我使用TaskFactory,我可以检查继续任务中从上一个任务抛出的异常,而不必使用Task.WaitAll方法.如果我使用Task.Run,​​则除非我明确等待子任务完成,否则将不会执行Continued任务.TaskFactory.StartNew中的哪个标志改变了这种行为?

另外,AggregateException类中的InnerException和InnerExceptions有什么区别?InnerExceptions返回一个由子任务抛出的所有异常的只读集合.InnerException返回仅由一个子任务抛出的异常的AggregateExcpetion.

//Use Factory
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw new NullReferenceException();}, atp);
    Task.Factory.StartNew (() => { throw new Exception("Test"); }, atp);
})
.ContinueWith (p => p.Exception.Dump(),TaskContinuationOptions.OnlyOnFaulted);

//Use Task.Run
Task.Run(()=>
{
    TaskCreationOptions op = TaskCreationOptions.AttachedToParent;
    var t1 = Task.Factory.StartNew(()=> {throw null;}, op);
    var t2 = Task.Factory.StartNew(()=> {throw new NullReferenceException();}, op);
    var t3 = Task.Factory.StartNew(()=> {throw new Exception("Test");}, op);

    //This will trigger the continued task
    //Task.WaitAll(new Task[]{t1,t2,t3}); 
}).ContinueWith(task => {task.Exception.Dump();}, TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)

Cha*_*ger 12

  • InnerExceptionException返回'导致此异常的异常'的属性.
  • InnerExceptions是一个独特的财产AggregateException.由于其设计,聚合异常可能包含多个"导致"异常.

由于属性InnerException是继承的,因此返回第一个异常是有意义的InnerExceptions.

要回答您的示例代码的行为的另一个问题,差异是TaskCreationOptions默认值Task.Run.默认是TaskCreationOptions.DenyChildAttach.您可以在此博客文章中阅读更多相关信息.

  • 如果你知道它是一个`AggregateException`,我想你不应该.`InnerException`仅用于维护`Exception`的契约. (2认同)