6

작업 병렬 라이브러리를 사용하여 - 취소 될 때 OperationCanceledException을 throw하고 다음과 같이 AggregateException을 사용하여 catch합니다. AggregateException에는 Throw 된 예외에 해당하는 TaskCanceledExceptions 목록이 포함되어 있습니다. 불행히도 이러한 TaskCanceledExceptions는 원래 예외가 던져 놓은 스택 추적을 잃어 버리는 것 같습니다. 디자인에 의한 것인가?AggregateException에 TaskCanceledException에 스택 추적이 포함되어 있지 않습니다.

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: 
+2

게시 한 결과를 반영하도록 코드를 업데이트하십시오! :) –

+0

"if (tcex! = null)"행이 맞습니까? "if (tcex == null)"이어야합니다. –

+0

@MatthewWatson -이 경우 'if'는 다른 예외를 필터링합니다. –

답변

1

나는 그것이 디자인의 생각, 작업은 작업이 작업이 종료하는 데 도움 의미로 취소 될 때 예외는 일반적으로 만 던져 취소했다. 이 상황에서 스택 추적은 어떤 목적을 가지고 있습니까? 그 말은 내가 취소 예외를 설계 한 개발자의 생각 프로세스에 대한 통찰력을 갖고 있지 않다는 것입니다. 단지 제 의견입니다.

원래 예외가 던져 놓은 스택 추적을 잃어 버렸다는 것이 무슨 뜻인지 잘 모르겠습니다. 일반적으로 내부/원래 예외는 없습니다. 아마도 다른 예외로 인해 작업을 취소하고 있습니까? 이 경우 업스트림의 "원본"예외를 잡아서 로그에 기록한 다음 취소해야합니다.

+3

스택 추적이 필요한 이유는 로깅 목적입니다. 내 코드의 여러 지점에서 ThrowIfCancellationRequested()를 호출합니다. 스택 추적을 로깅하면 취소 요청이 승인 된 시점을 식별 할 수 있습니다. – sfarrugia

관련 문제