第47章 えっ!? 3

 前回、前々回のプログラムで何か気が付いたことはありませんか? 今回話すことは、もしかしたらそのことについてかもしれません。


 ではでは、今回の要点です。


 では、いってみましょう。


 前回までは例外として数値を投げていました。これはそういう仕様なのでしょうか? ちょっと実験してみましょう。

プログラム
// Except2.cpp
#include <iostream.h>

int main()
{
    try
    {
        throw "例外発生!";
    }
    catch(int fError)
    {
        // ???
    }
    return 0;
}
実行結果例
abnormal program termination

 一応コンパイルはできましたが、catch で受け取る値は int です。どうなるのか...と思いきや、異常終了してしまいました。

 どうやら、int 以外の値も投げることはできるようです。しかし、その例外は catch(int) では受け取れないようです。

 ということは、catch(char*) なら受け取れるのでしょうか? ちょっと試してみましょう。

プログラム
// Except2b.cpp
#include <iostream.h>

int main()
{
    try
    {
        throw "例外発生!";
    }
    catch(char* pszError)
    {
        cout << pszError << endl;
    }
    return 0;
}
実行結果
例外発生!

 見事キャッチできました。

 このように、例外はどんな型のデータでも投げることができます。そして、その例外をキャッチするには、同じ型の値を受け取る catch を使わないといけないのです。


 では、2種類以上の例外が投げられる可能性のある場合はどうなるのでしょうか? catch ブロックを2つ以上書いてもいいのでしょうか? やはり、これも実験してみましょう。

プログラム
// Except3.cpp
#include <iostream.h>

int main()
{
    while(true)
    {
        try
        {
            int type;
            cin >> type;

            if(type == 0)
                return 0;
            else if(type == 1)
                throw 1;
            else
                throw "例外発生!";
        }
        catch(int fError)
        {
            cout << fError << endl;
        }
        catch(char* pszError)
        {
            cout << pszError << endl;
        }
    }
    // 一応 return 0; を書いておきます
    return 0;
}
実行結果
1
1
2
例外発生!
0

 大丈夫なようです。

 このように、catch ブロックは複数あっても構いません。もちろん、同じ型の例外を受け取るブロックを2つ書くのはエラーです。ですが、違う型の例外を受け取るブロックは、このように問題ありません。

 また、あらゆる例外を一度に捕捉したければ catch(...) で捕捉できます。ただし、もちろん値は取得できません。このときに捕捉される例外には「0除算例外」「不正アクセス例外」などのような、throw で投げた例外以外の例外も含まれます。


 まとめると、


ということになります。

 例外処理はまだまだ続きます。それでは。


第46章 えっ!? 2 | 第48章 えっ!? 4

Last update was done on 2001.2.28

この講座の著作権はロベールが保有しています