首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TimeoutException,TaskCanceledException C#

TimeoutException,TaskCanceledException C#
EN

Stack Overflow用户
提问于 2014-07-21 13:35:37
回答 1查看 4.8K关注 0票数 7

我是C#的新手,我发现一些例外有点令人困惑.我有一个具有以下代码的web应用程序:

代码语言:javascript
运行
复制
try
{
    //do something
}
catch (TimeoutException t)
{
    Console.WriteLine(t);
}
catch (TaskCanceledException tc)
{
    Console.WriteLine(tc);
}
catch (Exception e)
{
    Console.WriteLine(e);
}

当我调试代码时,它会抛出e Exception,这是最普通的代码,当我悬停在异常信息上时,结果是TaskCanceledException。为什么TaskCanceledException没有被捕获?如果异常是TimeoutException,它会捕获TimeoutException还是也会捕获Exception?为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-21 13:49:27

当捕获一个Exception时,您必须确保它正是--正抛出的异常--。当使用Task.RunTask.Factory.Startnew并通常涉及从Task引发的异常(除非正在等待任务时使用await关键字)时,您要处理的外部异常是AggregateException,因为Task单元可能有可能引发异常的子任务。

来自异常处理(任务并行库)

在任务中运行的用户代码引发的未处理异常将传播回连接线程,但在本主题后面将描述的某些方案除外。当您使用静态或实例Task.Wait或Task.Wait方法之一时,异常将被传播,并通过将调用封装在try-catch语句中来处理它们。如果某个任务是附加子任务的父任务,或者正在等待多个任务,则可能引发多个异常。为了将所有异常传播回调用线程,任务基础结构将它们包装在一个AggregateException实例中。AggregateException具有一个InnerExceptions属性,可以枚举该属性来检查抛出的所有原始异常,并单独处理(或不处理)每个异常。即使只有一个异常被抛出,它仍然被包装在一个AggregateException中。

所以,为了解决这个问题,你必须抓住AggregateException

代码语言:javascript
运行
复制
try
{
    //do something
}
catch (TimeoutException t)
{
    Console.WriteLine(t);
}
catch (TaskCanceledException tc)
{
    Console.WriteLine(tc);
}
catch (AggregateException ae)
{
   // This may contain multiple exceptions, which you can iterate with a foreach
   foreach (var exception in ae.InnerExceptions)
   {
       Console.WriteLine(exception.Message);
   }
}
catch (Exception e)
{
    Console.WriteLine(e);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24866455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档