25章 例外機構

http://www.geocities.jp/ky_webid/cpp/language/025.html

例外の処理です。前回にちょろっと出てきましたね。

tryブロックで囲ったスコープ内でエラーが発生したら、そのエラーの種別毎にcatchブロックで処理を続行させることができます。

まずはシンプルな例外処理の例を実装しています。

#include <iostream>
using namespace std;

int main () {
    try {
        throw "error dayo";
    }
    catch ( const char* err ) {
        cout << err << endl;
    }
    
    return 0;
}
$ main
error dayo

throwキーワードというもので明示的にエラーを発生させることができます。

また、

throwキーワードがなくても、C++ の言語仕様として、あるいは、標準ライブラリが例外をスローする場面があります。例えば、new によるメモリ確保が失敗したとき、std::bad_alloc という例外をスローします。

とあるように、様々な例外が投げられるようです。他にどんなものが存在するかは後の章で紹介があるとのことです。

catchにはthrowで投げられた型を指定することができます。最初の例ではchar*型でしたが、他の型でもいけるようです。

また、複数のcatchを指定しておくことでどれかのcatchにマッチしたらそのcatchブロックの処理が呼ばれるといった感じになります。

#include <iostream>
using namespace std;

int main () {
    try {
        throw 100; // int型でthrow
    }
    catch ( const char* err ) {
        // ここには来ない
        cout << "char: " << err << endl;
    }
    catch ( int num ) {
        // こっちに来る
        cout << "int: " << num << endl;
    }
    
    return 0;
}
$ main
int: 100

intの方のcatchブロックに遷移してるのがわかりますね。