C++ 基礎
首都大学東京 田川研究室
戻る

例外処理

例外処理というものがC++には用意されています。これもまた多少の処理速度の犠牲で、多大なバグの削減を可能とするものです。
以下例。
#include <iostream>//用いるヘッダファイルが変わります。
using namespace std;//std::を省略

int main()
{
    int ia;

    

    cin.exceptions(ios::failbit);//まずはcinの例外処理を有効にします。

    cout << "数値を入力してください ia = ";
    while(true)
    {
        
        try{
            cin >> ia;
        }
        catch(...)
        {
            cout << "\n数値を入力しろっつってんだろうがぁー!やり直し。 \nia =";

            cin.clear();//例外を消去。
            cin.seekg(0);//よくわかりませんがとりあえず書く。
            continue;
        }

        break;
    }
    cout << "\n入力された数値は " << ia <<"です\n";


    return 0;
}
try{}
まずは例外が発生しそうな場所をtryブロックで監視します。たとえば数値を入力しろといっているのに文字を入力されたりする可能性があります。

catch(...){}
例外が発生すればcatchブロックに処理が飛んできますので、そこで対処します。
対処が終わった場合、もう一度cinをやり直したいなら、clear() , seekg(0)の二つを呼び出すと例外がリセットされます。これを行わないとcinは失敗し続け、ずっと例外を返してきます。

この std::cin の例外処理は役に立つと思いますがどうでしょう?
あるいはまとめて例外に対処することもできます。以下その例です。
#include <iostream>//用いるヘッダファイルが変わります。
using namespace std;//std::を省略

void Initfunc(int i)
{
    if(i<0)
        throw "マイナスだぁー ";
}

int main()
{
    try
    {
        Initfunc(0);
        Initfunc(4);
        Initfunc(1);
        Initfunc(3);
        Initfunc(2);
        Initfunc(-1);
    }
    catch(char *pstr)
    {
        cout << "初期化中に例外発生 str=" << pstr << "\n";
    }

    return 0;
}

throw
これで例外を発生させることができます。例外にはいろんなものを投げることができ、数値だったり、文字列だったりします。

catch(char *pstr){}
と先ほどと変わっていますが、この例外ブロックは文字列が例外として投げられたときに処理を受け取ります。受け取り側の引数の型と同じ例外ブロックへ飛ぶようになっているわけです。面倒くさい場合は、

catch(...){}
これで全部の例外を受け取れます。