try ブロックがネストされており、
内側の try ブロックによって呼び出された関数内で throw が生じる場合は、
制御は、引き数が throw 式の引き数と一致する最初の catch ブロックが見つかるまで、
ネストされた try ブロック間を外側に向けて渡されて行きます。
次に例を示します。
try { func1(); try { func2(); } catch (spec_err) { /* ... */ } func3(); } catch (type_err) { /* ... */ } // if no throw is issued, control resumes here.
上記の例で、spec_err が内側の try ブロック (この場合は、func2() から) 内でスローされる場合、内側の catch ブロックがこの例外をキャッチします。 この catch ブロックが制御権移動を行わない場合は、func3() が呼び出されます。 内側の try ブロックの後で spec_err がスローされた場合 (例えば func3() によって)、 この例外はキャッチされずに、関数 terminate() が呼び出されます。 内側の try ブロックの中の func2() からスローされた例外が type_err である場合、 プログラムは、func3() を呼び出さず、両方の try ブロックから出て 2 番目の catch ブロックにスキップします。これは、内側の try ブロックの後には、適切な catch ブロックがないためです。
catch ブロック内で try ブロックをネストすることもできます。
関連参照