TaskCanceledException in AggregateException 不包含堆栈跟踪

本文关键字:堆栈 跟踪 包含 in AggregateException TaskCanceledException | 更新日期: 2023-09-27 18:30:57

我正在使用任务并行库来运行一个任务,该任务在取消时会抛出OperationCanceledException,然后使用AggregateException捕获该异常,如下所示。 AggregateException 包含 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: 

TaskCanceledException in AggregateException 不包含堆栈跟踪

我认为这是设计使然,任务取消异常通常仅在任务被取消时才引发,以帮助任务退出。 在这种情况下,堆栈跟踪有什么用途? 话虽如此,我对设计取消例外的开发人员的思维过程没有深入了解,只是我的意见。

我不太确定他们丢失原始异常引发的堆栈跟踪是什么意思? 通常,它们不会有内部/原始例外。 也许您由于其他异常而取消任务? 在这种情况下,您应该在上游捕获"原始"异常,将其记录在那里,然后在之后取消。