ノードのボディー内で例外をキャッチした場合、実行は通常継続されます。例外がスローされ、ノードのボディーの外に伝わる前にキャッチできなかった場合、グラフのノードのすべての実行はキャンセルされ、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_node、f2 はボディー内でキャッチされない例外をスローします。そのため、グラフの実行はキャンセルされ、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"; }
この場合、グラフの実行はキャンセルされます。例では、入力 1 が f3 に達しないで、入力 2 が f2 または f3 のいずれかに達しないことを意味します。