関数tryブロック

ロベールのC++入門講座 10-08

コンストラクタの初期化子で発生した例外をキャッチする方法として関数tryブロックというものがあります。

#include <iostream>
#include <string>
using std::cout; using std::endl;

class CSample {
public:
    CSample (std::string str)  try: m_str(str) {
        cout << "コンストラクタ" << endl;
    }
    catch (const std::bad_alloc& e) {
        // std::stringのメモリ確保に失敗した場合にここにくる
    }
private:
    std::string m_str;
};

int main () {
    CSample obj("str");
    return 0;
}

上記のようにm_strの初期化子の前にtry:と書いておくと、コンストラクタのブロックの後にそのままcatchブロックを書くことができます。

見た目の複雑さが玉に傷ですね。こんなことするくらいなら初めから初期化子を使わずに

CSample (std::string str) {
    try {
        m_str = str;
    catch (const std::bad_alloc& e) {
        // std::stringのメモリ確保に失敗した場合にここにくる
    }
}

こうした方が綺麗ですよね。

ちなみにこの関数tryブロックは古いコンパイラではサポートしていないようなので注意が必要です。