Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TimeoutException,TaskCanceledException C#_C#_Exception Handling_Timeoutexception - Fatal编程技术网

TimeoutException,TaskCanceledException C#

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); } 当我调试代码时,它

我是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
还是还会捕获
异常
?这是为什么?

捕获异常时,必须确保它正是抛出的异常。当使用
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
是从
任务中抛出的,因为它可能还包含子任务。它只是一个包装。