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

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

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