我正在努力更好地掌握 TPL 中异常和错误处理的基本原理(以及 .NET 4.5 异步/等待任务中的更多运气)
对我之前的问题“如何更好地理解“异步 - 处理多个异常”文章中的代码/语句?”稍作修改 运行 2 个分离的内部嵌套附加(依赖)子级的 C# 控制台应用程序代码(更新:抱歉,开始了一个问题但以另一个问题结束!)任务:
class Program
{
static void Main(string[] args)
{ Tst();
Console.ReadLine();
}
async static Task Tst()
{
try
{
await Task.Factory.StartNew
(() =>
{
Task.Factory.StartNew
( () => {
Console.WriteLine("From 1st child");
throw new NullReferenceException();
}
, TaskCreationOptions.AttachedToParent
);
Task.Factory.StartNew
( () =>
{
Console.WriteLine("From 2nd child");
throw new ArgumentException();
}
,TaskCreationOptions.AttachedToParent
);
}
);
}
catch (AggregateException ex)
{
Console.WriteLine("** {0} **", ex.GetType().Name);
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine(exc.GetType().Name);
}
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
产生在以下之间交替(非确定性)的输出:
From 1st child
From 2nd child
** AggregateException **
ArgumentException
和
From 1t child
From 2nd child
** AggregateException **
NullReferenceException
似乎总是传播/捕获子任务之一的一个且只有一个异常。
为什么只有一个异常传播/捕获?
我会更好地理解是否始终捕获子任务的所有异常或所有异常
在这种情况下,是否有可能同时捕获或不捕获异常?