2017-10-26 20 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

コードはwaitが試行される前にエラーが起きているという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

関連する問題