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