运行下面的C#控制台应用程序
class Program
{ static void Main(string[] args)
{ Tst();
Console.ReadLine();
}
async static Task Tst()
{
try
{
await Task.Factory.StartNew
(() =>
{
Task.Factory.StartNew
(() =>
{ throw new NullReferenceException(); }
, TaskCreationOptions.AttachedToParent
);
Task.Factory.StartNew
( () =>
{ throw new ArgumentException(); }
,TaskCreationOptions.AttachedToParent
);
}
);
}
catch (AggregateException ex)
{
// this catch will never be target
Console.WriteLine("** {0} **", ex.GetType().Name);
//****** Update1 - Start of Added code
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine(exc.GetType().Name);
}
//****** Update1 - End of Added code
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
产生输出:
** AggregateException **
虽然,上面的代码被复制从第一个片段“异步-处理多个异常”博客文章,其中讲述了它:
下面的代码将捕获的单个的NullReferenceException或ArgumentException异常(在AggregateException将被忽略)
问题出在哪儿:
- 文章是错误的?
哪个代码/报表,以及如何才能正确地理解它的变化? - 我在再现文章的第一代码片段犯了一个错误?
- 这是由于在.NET 4.0 / VS2010异步CTP扩展的错误,我使用?
UPDATE1(响应svick的答案 )
在添加代码
//****** Update1 - Start of Added code
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine(exc.GetType().Name);
}
//****** Update1 - End of Added code
所产生的输出是:
** AggregateException **
NullReferenceException
所以,还评论说马特·史密斯 :
该
AggregateException
被抓,只包含被抛出(或者是一个例外NullReferenceException
或ArgumentException
取决于子任务的执行顺序)
最可能的是,文章仍然是正确的,或者至少是非常有用的。 我只需要了解如何更好地阅读/理解/使用
UPDATE2(响应svick的答案 )
执行svick的代码:
internal class Program
{
private static void Main(string[] args)
{
Tst();
Console.ReadLine();
}
private static async Task Tst()
{
try
{
await TaskEx.WhenAll
(
Task.Factory.StartNew
(() =>
{ throw new NullReferenceException(); }
//, TaskCreationOptions.AttachedToParent
),
Task.Factory.StartNew
(() =>
{ throw new ArgumentException(); }
//,TaskCreationOptions.AttachedToParent
)
);
}
catch (AggregateException ex)
{
// this catch will never be target
Console.WriteLine("** {0} **", ex.GetType().Name);
//****** Update1 - Start of Added code
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine("==="+exc.GetType().Name);
}
//****** Update1 - End of Added code
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
}
生产:
## NullReferenceException ##
输出。
为什么不AggregateException
生产或抓?