当前位置: 首页 > 编程语言 > C#

如何更好地理解《异步-处理多个异常》一文中的代码-语句?分享

时间:2023-04-10 14:36:50 C#

《异步-处理多个异常》一文中的代码/语句如何更好的理解?运行以下C#控制台应用程序类程序{staticvoidMain(string[]args){Tst();控制台.ReadLine();}asyncstaticTaskTst(){try{awaitTask.Factory.StartNew(()=>{Task.Factory.StartNew(()=>{thrownewNullReferenceException();},TaskCreationOptions.AttachedToParent);Task.Factory.StartNew(()=>{thrownewArgumentException();},TaskCreationOptions.AttachedToParent);});}catch(AggregateExceptionex){//这个catch永远不会成为目标Console.WriteLine("**{0}**",ex.GetType().Name);//******Update1-添加代码的开始foreach(varexcinex.Flatten().InnerExceptions){}//******Update1-添加代码结束}catch(Exceptionex){Console.WriteLine("##{0}##",ex.GetType().Name);}}产生输出:**AggregateException**不过,上面的代码来自“Async–HandlingmultipleExceptions”博文第一个片段,文章说:下面的代码将捕获单个NullReferenceException或ArgumentExceptionexception(AggregateException将被忽略)问题出在哪里:文章错了吗?什么代码/语句以及我应该如何更改它才能正确理解它?我在复制文章的第一个代码片段时是否犯了错误?这是由于我正在使用的.NET4.0/VS2010异步CTP扩展中的错误吗?Update1(响应svick的回答)添加代码后//******Update1-添加代码开始);}//******Update1-添加代码的结尾产生的输出是:**AggregateException**NullReferenceException所以,马特·史密斯也评论道:捕获的AggregateException只包含抛出的一个异常(特别是NullReferenceException或ArgumentException取决于子任务的执行顺序)很可能,这篇文章仍然是正确的,或者至少非常有用我只需要了解如何更好地阅读/理解/使用它Update2(响应svick的回答)执行svick的代码:控制台.ReadLine();}privatestaticasyncTaskTst(){try{awaitTaskEx.WhenAll(Task.Factory.StartNew(()=>{thrownewNullReferenceException();}//,TaskCreationOptions.AttachedToParent),Task.Factory.StartNew(()=>{thrownewArgumentException();}//,TaskCreationOptions.AttachedToParent));}catch(AggregateExceptionex){//这个catch永远不会成为目标Console.WriteLine("**{0}**",ex.GetType().Name);//******Update1-开始添加代码foreach(varexcinex.Flatten().InnerExceptions){}//******Update1-添加代码结束}catch(Exceptionex){Console.WriteLine("##{0}##",ex.GetType().Name);}}}产生:##NullReferenceException##输出。为什么没有生成或捕获AggregateException?这篇文章是错误的。运行代码时,awaitedTask包含如下所示的异常:.在这里,它是另一个AggregateException,所以这就是抛出的内容。Task有多个异常的代码示例,其中一个在await之后直接重新抛出,将使用Task.WhenAll()而不是AttachedToParent:();}),Task.Factory.StartNew(()=>{thrownewArgumentException();}));}catch(AggregateExceptionex){//这个catch永远不会成为目标Console.WriteLine("**{0}**",ex.GetType().Name);}catch(Exceptionex){Console.WriteLine("##{0}##",ex.GetType().Name);}为响应您的“更新2”,推理仍然与svick的回答相同。该任务包含一个AggregateException,但等待它会抛出第一个InnerException。您需要的其他信息在Task.WhenAll文档(重点是我的)中:如果任何提供的任务以失败告终,则返回的任务也将以失败告终,其中异常将包含来自每个提供的任务的数据一组未包装的异常的集合。因此,Task的异常将如下所示:以上是C#学习教程:如何更好地理解《异步-处理多个异常》一文中的代码/语句?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——AggregateExceptionNullReferenceExceptionArgumentException本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: