Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TaskCanceledException in AggregateException does not contain stack trace

I am using the Task Parallel Library to run a task which - when cancelled - throws the OperationCanceledException, which is then caught using the AggregateException, as follows. The AggregateException contains a list of TaskCanceledExceptions, which correspond to the thrown exceptions. Unfortunately, these TaskCanceledExceptions seem to be losing the stack traces thrown by the original exceptions. Is this by design?

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;
    }
}

Result:

InnerException:, Message:A task was canceled., Source:, StackTrace: 
like image 635
steffar Avatar asked Apr 13 '12 15:04

steffar


1 Answers

I would think it's by design, task canceled exceptions are normally only thrown when a task is canceled as mean to help the task to exit. What purpose does a stack trace have in this situation? That being said I don't have insight into the thought process of the dev's that designed the cancellation exceptions, just my opinion.

I'm not quite sure what you mean by they lose the stack trace thrown by the original exception? Normally they would not have an inner/original exception. Perhaps you are canceling a task due to some other exception? In that case you should be catching the "original" exception upstream, logging it there, then canceling after.

like image 91
Kenneth Ito Avatar answered Oct 23 '22 14:10

Kenneth Ito