AggregateException 中的 C# InnerException
C# InnerException in AggregateException
我有如下代码来捕获使用 TaskFactory 和 Task.Run 创建的任务抛出的异常。如果我使用 TaskFactory,则无需使用 Task.WaitAll 方法即可检查 Continued 任务中上一个任务抛出的异常。如果我使用 Task.Run,Continued 任务将不会执行,除非我明确等待子任务完成。 TaskFactory.StartNew 中的哪个标志改变了此行为?
还有InnerException和AggregateException中的InnerExceptions有什么区别class? InnerExceptions returns 是子任务抛出的所有异常的只读集合。 InnerException returns 仅由一个子任务抛出的 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);
InnerException
是 Exception
和 returns 'the exception that caused this exception' 的 属性。
InnerExceptions
是 AggregateException
独有的 属性。由于其设计,聚合异常可以包含多个 'causing' 异常。
由于 属性 InnerException
是继承的,因此 returns 是 InnerExceptions
的第一个异常是有道理的。
要回答有关示例代码行为的其他问题,区别在于 Task.Run
的 TaskCreationOptions
默认值。默认值为 TaskCreationOptions.DenyChildAttach
。您可以在 this blog post.
中阅读更多相关信息
我有如下代码来捕获使用 TaskFactory 和 Task.Run 创建的任务抛出的异常。如果我使用 TaskFactory,则无需使用 Task.WaitAll 方法即可检查 Continued 任务中上一个任务抛出的异常。如果我使用 Task.Run,Continued 任务将不会执行,除非我明确等待子任务完成。 TaskFactory.StartNew 中的哪个标志改变了此行为?
还有InnerException和AggregateException中的InnerExceptions有什么区别class? InnerExceptions returns 是子任务抛出的所有异常的只读集合。 InnerException returns 仅由一个子任务抛出的 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);
InnerException
是Exception
和 returns 'the exception that caused this exception' 的 属性。InnerExceptions
是AggregateException
独有的 属性。由于其设计,聚合异常可以包含多个 'causing' 异常。
由于 属性 InnerException
是继承的,因此 returns 是 InnerExceptions
的第一个异常是有道理的。
要回答有关示例代码行为的其他问题,区别在于 Task.Run
的 TaskCreationOptions
默认值。默认值为 TaskCreationOptions.DenyChildAttach
。您可以在 this blog post.