ネストされた try ブロック

C++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 ブロックをネストすることもできます。

関連参照

IBM Copyright 2003