2017-10-26 1 views
2

AggregateException을 발생시키지 않는 다음 코드가 있습니다. 누적 예외가 발생하지 않고 이유를 모르겠습니다. 일반적으로이 같은 집계 예외는 없습니다 Test()을 실행하는 작업의 완성, 코드를 사용하여 작업TPL을 사용할 때 예외가 발생하지 않습니다.

당신이 ( Test2()를 실행)하여 연속 작업의 완료를 기다리지 때문이다
class Program 
    { 
     static void Main(string[] args) 
     { 
      var task1 = Task.Factory.StartNew(() => 
      { 
       Test(); 
      }).ContinueWith((previousTask) => 
      { 
       Test2(); 
      }); 


      try 
      { 
       task1.Wait(); 
      } 
      catch (AggregateException ae) 
      { 
       foreach (var e in ae.InnerExceptions) 
       { 
        // Handle the custom exception. 
        if (e is CustomException) 
        { 
         Console.WriteLine(e.Message); 
        } 
        // Rethrow any other exception. 
        else 
        { 
         throw; 
        } 
       } 
      } 
     } 

     static void Test() 
     { 
      throw new CustomException("This exception is expected!"); 
     } 

     static void Test2() 
     { 
      Console.WriteLine("Test2"); 
     } 
    } 

    public class CustomException : Exception 
    { 
     public CustomException(String message) : base(message) 
     { } 
    } 
} 
+0

디버거가 코드에 기회가 있기 전에 잡기가 아닌지 확인하십시오. – BugFinder

+0

디버거를 사용하지 않아도 같은 문제가 발생합니다. ''이 예외가 예상됩니다 .''' – codejunkie

+0

코드가 기다림을 시도하기 전에 StartNew를 사용했기 때문에 Id가 생각했습니다. – BugFinder

답변

3

을 실행하는 동안 예외를 잡기 위해 사용한다. 첫 번째 작업이 예외로 실패하고 계속 작업이이 예외로 수행되지 않습니다 (previousTask이 실패했는지 확인하지 않음). 성공적으로 완료됩니다. 당신이 첫 번째 작업 기다리거나 계속에서의 결과를 확인할 필요가있는 예외를 잡을 :

var task1 = Task.Factory.StartNew(() => 
{ 
    Test(); 
}); 
var task2 = task1.ContinueWith((previousTask) => 
{ 
    Test2(); 
}); 

또는 모든이 나처럼 그것을 정말해야하는지 여부에 물론 관련이없는 것

var task1 = Task.Factory.StartNew(() => 
{ 
    Test(); 
}).ContinueWith((previousTask) => 
{ 
    if (previousTask.Exception != null) { 
     // do something with it 
     throw previousTask.Exception.GetBaseException(); 
    } 
    Test2(); 
}); // note that task1 here is `ContinueWith` task, not first task 

그냥 질문에 대답하는 것이 아닙니다.

+0

예외가 발생하면 AggregateException이 발생해야합니까? – codejunkie

+0

@codejunkie 예, 대답으로 코드를 실행하면'AggregateException'을 잡아낼 수 있습니다. – Evk