#include <iostream> #include <exception> struct X { X(){ std::cout << "X::ctor" << std::endl; } ~X(){ std::cout << "X::dtor" << std::endl; } }; struct Y { Y() { std::cout << "Y::ctor (throws an exception)" << std::endl; throw std::exception(); } ~Y(){ std::cout << "Y::dtor" << std::endl; } }; struct Z { Z() try // 初期化子リストから飛んでくる例外をキャッチ : x(), y() // ここから例外が飛んでくる { /*ここがコンストラクタの本体*/ } catch(...){ // 初期化子リストで例外が投げられるとここにコントロールが移る. // ここにコントロールが移る時点ですでに初期化子リストで構築された // オブジェクト(この例ではx)に対してはデストラクタが呼ばれている. std::cout << "Z::ctorの初期化子リストで投げられた例外を捉えました" << std::endl; throw; } X x; Y y; }; int main() { try{ Z z; } catch(...){ // ここは単に例外を握りつぶしてるだけ } }
とりあえず第一感は「こんな構文あったのね」.