我是C#的新手,我发现一些例外有点令人困惑.我有一个具有以下代码的web应用程序:
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?为什么会这样呢?
发布于 2014-07-21 13:49:27
当捕获一个Exception时,您必须确保它正是--正抛出的异常--。当使用Task.Run或Task.Factory.Startnew并通常涉及从Task引发的异常(除非正在等待任务时使用await关键字)时,您要处理的外部异常是AggregateException,因为Task单元可能有可能引发异常的子任务。
来自异常处理(任务并行库)
在任务中运行的用户代码引发的未处理异常将传播回连接线程,但在本主题后面将描述的某些方案除外。当您使用静态或实例Task.Wait或Task.Wait方法之一时,异常将被传播,并通过将调用封装在try-catch语句中来处理它们。如果某个任务是附加子任务的父任务,或者正在等待多个任务,则可能引发多个异常。为了将所有异常传播回调用线程,任务基础结构将它们包装在一个AggregateException实例中。AggregateException具有一个InnerExceptions属性,可以枚举该属性来检查抛出的所有原始异常,并单独处理(或不处理)每个异常。即使只有一个异常被抛出,它仍然被包装在一个AggregateException中。
所以,为了解决这个问题,你必须抓住AggregateException
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);
}https://stackoverflow.com/questions/24866455
复制相似问题