読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

コンストラクタの初期化子で起こった例外をキャッチする

C++ 備忘録

new と delete と throw で気をつけること(自分用メモ) - IT戦記
ここを読んでいて、そう言えば初期化子で起こった例外って取れた気がすると思い調べてみたので備忘録として残す。


下記記事が詳しいので、細かい話はこちらへ^^;

先にまとめ

先日も書いたけど、ポインタを裸で持つのは精神衛生上良くないので、shared_ptr を使う方がいいと思う。
Visual Studio 2008 SP1 から TR1 として boost なしで使えるので敷居も下がっいている。
ただし、TR1 の shared_ptr は std::tr1::shared_ptr なので、
こいつをちょっといじってあげる

namespace std {
    using namespace std::tr1;
}

これで std::shared_ptr として使えるのでもう標準:)

実行結果

Visual Studio 2008 SP1 で確認

サンプルコード

#include <iostream>
#include <stdexcept>
#include <memory>

class ClassA
{
public:

    ClassA( bool exception )
    {
        std::cout << "ClassA::ClassA()" << std::endl;
        if ( exception ) {
            throw std::runtime_error( "ClassA::ClassA()からの例外" );
        }
    }

    ~ClassA()
    {
        std::cout << "ClassA::~ClassA()" << std::endl;
    }
};

class ClassB
{
public:

    ClassB()
    try
        : classA_( true )
    {
        std::cout << "ClassB::ClassB()" << std::endl;
        throw std::runtime_error( "ClassB::ClassB()からの例外" );
    }
    catch ( std::exception& ex ) 
    {
        std::cout << ex.what() << ":ClassB::ClassB() でキャッチ" << std::endl;
    }

    ~ClassB()
    {
        std::cout << "ClassB::~ClassB()" << std::endl;
    }

private:

    ClassA classA_;
};

void main()
{
    try {
        ClassB b;
    }
    catch ( std::exception& ex ) {
        std::cout << ex.what() << ":main() でキャッチ" << std::endl;
    }
}
// EOF