C++ プログラミングガイド

try ブロック内に関数を入れる

クラス T の基底クラスまたはメンバーのコンストラクタが例外によって終了した場合、T コンストラクタがその例外を検出または処理する方法は通常ありません。例外は、T コンストラクタの本体に入る前 (つまり T 内の try ブロックに入る前) に送出されることになります。

C++ には、try ブロック内に関数全体を入れる新機能があります。通常の関数の場合、その効果は関数の本体を try ブロック内に入れることと変わりません。しかし、コンストラクタの場合、こうすることで try ブロックはコンストラクタのクラスの基底クラスとメンバーの初期設定子を回避する例外をすべてトラップするようになります。関数全体が try ブロックで囲まれる場合、そのブロックは「関数 try ブロック」と呼ばれます。

次の例では、基底クラス B またはメンバー E のコンストラクタから送出される例外はすべて T コンストラクタの本体に入る前に捕獲され、一致する catch ブロックにより処理されます。

catch ブロックは関数の外にあるため、関数 try ブロックのハンドラ内で return 文は使用できません。exit() を呼び出して例外を送出するか、あるいは terminate() を呼び出してプログラムを停止するしかありません。


class B { ... };
class E { ... };
class T : public B {
public:
    T();
private:
    E e;
};
T::T()
try  : B(args), E(args)
{
    ... // コンストラクタの本体
}
catch( X& x ) {
   ... // 例外 X を処理する
}
catch( ... ) {
   ... // 他の例外を処理する
}