改善C#程序的157个建议(连载85)

发表于:2011-12-05 09:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议85:Task中的异常处理

  在任何时候,异常处理都是非常重要的一个环节。多线程与并行编程中尤其是这样。如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出。处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上。

  在任务并行库中,如果对任务运行Wait、WaitAny、WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常。可以将AggregateException异常看做是任务并行库编程中最上层的异常。在任务中捕获的异常,最终都应该包装到AggregateException中。一个任务并行库异常的简单处理示例如下:

  • static void Main(string[] args)  
  • {  
  •     Task t = new Task(() => 
  •         {  
  •             throw new Exception("任务并行编码中产生的未知异常");  
  •         });  
  •     t.Start();  
  •     try  
  •     {  
  •         //若有Result,可求Result  
  •         t.Wait();  
  •     }  
  •     catch (AggregateException e)  
  •     {  
  •         foreach (var item in e.InnerExceptions)  
  •         {  
  •             Console.WriteLine("异常类型:{0}{1}来自:  
  •  {2}{3}异常内容:{4}", item.GetType(), Environment.NewLine,  
  •  item.Source, Environment.NewLine, item.Message);  
  •         }  
  •     }  
  •     Console.WriteLine("主线程马上结束");  
  •     Console.ReadKey();  
  • }
  •   上面的代码输出:

  • 异常类型:System.Exception  
  • 来自:ConsoleApplication3  
  • 异常内容:任务并行编码中产生的未知异常  
  • 主线程马上结束
  •   大家也许已经注意到,虽然运行Wait、WaitAny、WaitAll方法,或者求Result属性能得到任务的异常信息,但是这会阻滞当前线程。这往往不是我们所希望看到的,岂能为了得到一个异常就故意等待?这时可以考虑任务并行库中Task类型的一个功能:新起一个后续任务,就可以解决等待的问题:

  • static void Main()  
  • {  
  •     Task t = new Task(() => 
  •     {  
  •         throw new Exception("任务并行编码中产生的未知异常");  
  •     });  
  •     t.Start();  
  •     Task ttEnd = t.ContinueWith((task) => 
  •     {  
  •         foreach (Exception item in task.Exception.InnerExceptions)  
  •         {  
  •             Console.WriteLine("异常类型:{0}{1}来自:  
  •                {2}{3}异常内容:{4}", item.GetType(), Environment.NewLine,  
  •                item.Source, Environment.NewLine, item.Message);  
  •         }  
  •     }, TaskContinuationOptions.OnlyOnFaulted);  
  •     Console.WriteLine("主线程马上结束");  
  •     Console.ReadKey();  
  • }
  •   输出为:

  • 主线程马上结束  
  • 异常类型:System.Exception  
  • 来自:ConsoleApplication3  
  • 异常内容:任务并行编码中产生的未知异常
  • 31/3123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号