-1

この回答からわずかに変更されたコードを再利用し、 @ svickのアドバイスを実装するためにコードを変更する方法:

ただし、Task を変数に保存して task.Exception.Flatten() を呼び出すと、両方の例外が返されます。

?

//C# console app
  class Program
  {
    static void Main(string[] args)
    {
      Test();
      Console.ReadLine();
    }
    async static Task Test()
    {
      Task containingTask, nullRefTask, argTask;
      try
      {
        containingTask = Task.Factory.StartNew
          (() =>
              {
                nullRefTask = Task.Factory.StartNew(() =>
                {
                    throw new NullReferenceException();
                }
                , TaskCreationOptions.AttachedToParent);

                argTask = Task.Factory.StartNew(() =>
                {
                    throw new ArgumentException();
                }
                , TaskCreationOptions.AttachedToParent);
              }
           );
        await containingTask;
        foreach(Exception ex in containingTask.Exception
                                              .Flatten().InnerExceptions)
        //Possible 'System.NullReferenceException'
        { //never entered
            Console.WriteLine("@@@@@"+ex.GetType().Name);
        } 
      }//try
      catch (AggregateException ex)
      {
        Console.WriteLine("** {0} **", ex.GetType().Name);
        foreach (var exc in ex.Flatten().InnerExceptions)
        {
          Console.WriteLine("$$$$$$"+exc.GetType().Name);
        }

//foreach (Exception exxx in containingTask.Exception.Flatten().InnerExceptions)
//Use of unassigned local variable 'containingTask' 
      }
//foreach (Exception exxx in containingTask.Exception.Flatten().InnerExceptions)
////Use of unassigned local variable 'containingTask'   
    }
  }

containingTask.Exception.Flatten().InnerExceptions try-/catch-blocks を使用して、または使用せずにアクセスしようとすると、 try-、- catchblocks の内外でエラーが発生します。

Use of unassigned local variable 'containingTask'   

また

Possible 'System.NullReferenceException'

両方の子タスクから両方の例外を表示/取得する方法は?

アップデート:

タイプミスを修正した後、コードが期待される結果を生成するため、この部分は質問から削除されました

バリアント #2 (C# コンソール アプリ): 「非同期 - 複数の例外の処理」
の「回避策」を再現して、すべての子タスクからのすべての例外を確認 しようとしています。

class Program
{
    static void Main(string[] args)
    {
        Tst();
        Console.ReadLine();
    }
    async static Task Tst()
    {
        try
        {
            Task t= Task.Factory.StartNew
                (
                    () =>
                       {
                           Task.Factory.StartNew
                           (
                               () =>
                                  { throw new NullReferenceException(); }
                               ,TaskCreationOptions.AttachedToParent
                           );
                           Task.Factory.StartNew
                           (
                               () =>
                                   { throw new ArgumentException(); }
                                   , TaskCreationOptions.AttachedToParent
                           );
                       }
                );
            await t.ContinueWith
                    (
                        tsk =>
                          {
                              if (tsk.Exception != null)
                                   throw tsk.Exception;
                           }
                    );
        }
        catch (AggregateException ex)
        {
            foreach (var exc in ex.Flatten().InnerExceptions)
            {
                Console.WriteLine("** {0} **", exc.GetType().Name);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("## {0} ##", ex.GetType().Name);
        }
    }
}

4

1 に答える 1