並列処理の例外処理

Last Updated 2011/09/21


並列処理における例外の処理は通常のアプリケーションにおけるそれとはチョット趣が異なります。何かプログラミング上の不都合が発生したので、それを処理するということにとどまらないからです。たとえば、タスクの実行をキャンセルする手順は、ワザと例外を発生させることになっています。

以下は、「Task クラスと TaskFactory クラス」の「待機メソッド」で書いたものと同じものです

  ....
  ....

  try
  {
    task.Wait();
  }
  catch (AggregateException ae)
  {
    ae.Handle((x) =>
    {
      Debug.WriteLine("AggregateException が発生しました。");
      return true;
    });
  }

並列処理において発生した例外を捕捉するには、タスクの実行を待機するメソッド(上の例では Wait メソッド)を try ... catch 文で囲みます。

さて、並列処理を実行中にエラーがあると、AggregateException 例外が発生します。これはそのほかの例外クラスとは異なる性格を持っています。クラス名の "aggregate&1uot; は、「集計する」です。並列処理ではアチコチのスレッドでいろいろな例外を投げてきます。そこで、それらをこの例外クラスに集約しようとするものです。AggregateException クラスの InnerExceptions プロパティは集約されたすべての例外のコレクションを返します。

上記のコードは、並列処理における例外の処理の典型的なコードですが、別のパターンとしては次のようなコードも考えられます。

  ....

  try
  {
    task.Wait();
  }
  catch (AggregateException ae)
  {
    foreach (var ex in ae.InnerExceptions)
    {
      if (ex is UnauthorizedAccessException)
      {
        Debug.WriteLine(ex.Message);
      }
      else
      {
        throw;
      }
    }
  }

並列処理にかかわる例外クラス

並列処理に関係する例外クラスをリストアップしておきます。クラスの詳細については、NETClass を参照してください。

AggregateExceptionタスクの実行中に発生する例外
OperationCanceledExceptionスレッドによる操作をキャンセルしたときに発生する例外
TaskCanceledExceptionタスクの取り消しを通知する例外
UnauthorizedAccessExceptionオペレーティングシステムが I/O エラーまたはセキュリティエラーのためにアクセスを拒否するときに発生する例外

並列処理のキャンセルにともなう例外

並列処理のキャンセルにかかわる例外処理については、「並列処理のキャンセル」をご覧ください。

−以上−