★複数のcatchを使う★


今回は複数のcatchを使う事について説明します。

「catch」は引数を受け取る事は前回分かったと思います。

実は、オーバーロード関数と同じく「引数の型」を変える事で複数の「catch」を書く事が出来るのです。

とりあえず、サンプルプログラムを作りましょう。

<sample program cpp081-01>

#include <iostream>

int main()
{
    int value;

    std::cin >> value;

    try {

        switch (value) {
        case 1:
            throw "ABC";
            break;
        case 2:
            throw 123;
            break;
        }

    }
    catch (const char *pMessage) {
        std::cout << pMessage << std::endl;
    }
    catch (const int value) {
        std::cout << value << std::endl;
    }

    return 0;
}

1つ目の「catch」は「char型のポインタ」ですが、2つ目の「catch」は「int型」になっています。

変数valueに1か2を入力すると「例外」を投げますので実際に実行してみましょう。

<実行結果1>

1
ABC
続行するには何かキーを押してください・・・

<実行結果2>

2
123
続行するには何かキーを押してください・・・

「throw」で「投げた」データの型によって、どちらの「catch」が例外を「捕まえて」いるか分かります。

このように「try」の中で発生した「例外」の種類によって「何を投げるか」変える事が出来るのです。


何でも「捕まえる」catch


さらに、どの型のデータでも「捕まえる」catchを書く事も出来ます。

<sample program cpp081-02>

#include <iostream>

int main()
{
    int value;

    std::cin >> value;

    try {

        switch (value) {
        case 1:
            throw "ABC";
            break;
        case 2:
            throw 123;
            break;
        case 3:
            throw 12.5;
            break;
        }

    }
    catch (const char *pMessage) {
        std::cout << pMessage << std::endl;
    }
    catch (const int value) {
        std::cout << value << std::endl;
    }
    catch (...) {
        std::cout << "Catch Exception" << std::endl;
    }

    return 0;
}

<実行結果>

3
Catch Exception
続行するには何かキーを押してください・・・

3を入力した時に投げる例外の型は「double型」です。

「double型」を「捕まえる」catchはありません。

が、引数を「...」にする事できちんと「捕まえる」事が出来ています。

引数に「...」を指定する事で、どんな型の例外でも「捕まえる」事が出来るようになるのです。


次へ

戻る

目次へ