我正在使用任务并行库来运行一个任务 - 当取消时 - 抛出OperationCanceledException,然后使用AggregateException捕获它,如下所示。 AggregateException包含TaskCanceledExceptions列表,它对应于抛出的异常。不幸的是,这些TaskCanceledExceptions似乎正在丢失原始异常抛出的堆栈跟踪。这是设计吗?
try
{
task1.Wait();
}
catch (AggregateException aggEx)
{
var tcex = ex as TaskCanceledException;
if (tcex != null)
{
Debug.WriteLine("InnerException:{0}, Message:{1}, Source:{2}, StackTrace: {3}",
tcex.InnerException, tcex.Message, tcex.Source, tcex.StackTrace);
return true;
}
else
{
return false;
}
}
结果:
InnerException:, Message:A task was canceled., Source:, StackTrace:
答案 0 :(得分:1)
我认为这是设计的,任务取消的异常通常只在任务被取消时才被抛出,以帮助任务退出。在这种情况下,堆栈跟踪的目的是什么?话虽如此,我并没有深入了解设计取消例外的开发者的思维过程,只是我的意见。
我不太清楚你的意思是他们丢失了原始异常抛出的堆栈跟踪?通常他们不会有内部/原始异常。也许你因为其他一些例外而取消了一项任务?在这种情况下,您应该捕获上游的“原始”异常,将其记录在那里,然后取消。