例外をスローするノード内部の例外のキャッチ

ノードのボディー内で例外をキャッチした場合、実行は通常継続されます。例外がスローされ、ノードのボディーの外に伝わる前にキャッチできなかった場合、グラフのノードのすべての実行はキャンセルされ、graph::wait_for_all() の呼び出しで例外が再びスローされます。次に例を示します。

  graph g;

  function_node< int, int > f1( g, 1, []( int i ) {  return i; } );

  function_node< int, int > f2( g, 1, 
      []( const int i ) -> int {
      throw i;
      return i;
  } );

  function_node< int, int > f3( g, 1, []( int i ) {  return i; } );

  make_edge( f1, f2 );
  make_edge( f2, f3 );
  f1.try_put(1);
  f1.try_put(2);
  g.wait_for_all();

上記のコードで、2 番目の function_nodef2 はボディー内でキャッチされない例外をスローします。そのため、グラフの実行はキャンセルされ、g.wait_for_all() の呼び出しで例外が再びスローされます。この例外は処理されないため、プログラムは終了します。必要に応じて、例外をボディー内でキャッチして処理できます。

  function_node< int, int > f2( g, 1, 
      []( const int i ) -> int {
          try {
              throw i;
          } catch (int j) {
              cout << "Caught " << j << "\n";
          }
          return i;
  } );

例外がボディー内でキャッチされ処理されても、グラフの実行そのものに影響はありません。しかし、代わりに wait_for_all の呼び出しで例外をキャッチすることもできます。

  try {
      g.wait_for_all();
  } catch ( int j ) {
      cout << "Caught " << j << "\n";
  }

この場合、グラフの実行はキャンセルされます。例では、入力 1f3 に達しないで、入力 2f2 または f3 のいずれかに達しないことを意味します。

関連情報