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