Mar*_*rta 7 c# exception-handling timeoutexception
我是C#的新手,我发现异常有点令人困惑......我有一个带有以下代码的Web应用程序:
try
{
//do something
}
catch (TimeoutException t)
{
Console.WriteLine(t);
}
catch (TaskCanceledException tc)
{
Console.WriteLine(tc);
}
catch (Exception e)
{
Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)
当我调试代码时,它抛出e Exception,最普遍的代码,当我将鼠标悬停在异常信息上时,结果证明它是TaskCanceledException.为什么没被TaskCanceledException抓住?如果异常是它TimeoutException会抓住它TimeoutException还是会抓住它Exception?这是为什么?
捕获时Exception,您必须确保它正是抛出的异常.当使用Task.Run或Task.Factory.Startnew通常涉及从a抛出异常时Task(除非正在等待await关键字的任务),你正在处理的外部异常是一个AggregateException,因为一个Task单元可能有子任务,也可能抛出异常.
由在本主题后面描述的某些方案除外,在任务内运行的用户代码抛出的未处理异常将传播回连接线程.当您使用静态或实例Task.Wait或Task.Wait方法之一时,会传播异常,并通过将调用封装在try-catch语句中来处理它们.如果任务是附加子任务的父项,或者您正在等待多个任务,则可能会抛出多个异常.要将所有异常传播回调用线程,Task infrastructure将它们包装在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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2784 次 |
| 最近记录: |