7

我正在使用任务并行库来运行一个任务,该任务在取消时会引发 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: 
4

1 回答 1

1

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

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

于 2012-04-13T18:00:52.023 回答