TimeoutException,TaskCanceledException C#
我是C#新手,我发现异常有点让人困惑。。。 我有一个具有以下代码的web应用程序:TimeoutException,TaskCanceledException C#,c#,exception-handling,timeoutexception,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); } 当我调试代码时,它
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
还是还会捕获异常
?这是为什么?捕获异常时,必须确保它正是抛出的异常。当使用Task.Run
或Task.Factory.Startnew
并且通常涉及从任务
引发异常时(除非该任务正在使用关键字等待),您处理的外部异常是,因为任务
单元可能具有也可能引发异常的子任务
发件人:
正在运行的用户代码引发的未处理异常
在任务内部传播回加入线程,但在
本主题后面将介绍的某些场景。例外情况
在使用静态或实例任务时传播。请等待或
Wait方法,并通过封闭调用来处理它们
在try-catch语句中。如果任务是附加子任务的父任务
任务,或者如果您正在等待多个任务,则
可以抛出异常。将所有异常传播回
调用线程时,任务基础结构将它们包装在
AggregateException实例。AggregateException有一个
InnerExceptions属性,该属性可以枚举以检查所有
抛出的原始异常,以及每个异常的句柄(或不句柄)
一个一个。即使只抛出一个异常,它仍然是
包装在AggregateException中
因此,为了解决这个问题,您必须捕获aggregateeexception
:
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);
}
您确定它不是从
任务
对象引发的聚合异常
?显示抛出调用…是的,是System.AggregateException,InnerException是System.Threading.Task.TaskCanceledException.Ok。现在,我的应用程序应该超时,但我得到的不是TimeoutException,而是包含TaskCanceledException的AggregateException。如何让程序捕获TimeoutException?基本上,是否可以抛出TimeoutException而不是TaskCanceledException?不,不可能。aggregateexception
是从任务中抛出的,因为它可能还包含子任务。它只是一个包装。