例外仕様

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

こはちょっとややこしいです。

例外仕様の正しい取扱いはかなり難しいと言わざるを得ません。多くの人がイメージするような挙動ではない(例外仕様に記述していない例外も、catch はできないが発生はする)ですし、 throw する例外の種類が特定されたところで、それほど大きな利点がある訳でもありません( throw されたが catch しなかった場合も、std::unexpected() に渡されて std::terminate() が実行された場合も、どちらにせよ、プログラムの強制終了に行きつくことに変わりはないので)。ですから、例外仕様を使うこと自体、やめておいた方が無難かも知れません。

という話らしいです。

またVC2008のコンパイラと別のコンパイラで挙動が違ったり色々とまだ不安定なので使わない方が良いのかもしれません。

とりあえずこういうものがあるというメモ的な立ち位置で軽く勉強しておきたおともいます。

関数を定義する際に、例外が発生する可能性を列挙することができます。

void foo (int flag) throw(int,const char*) {
    if ( flag ) {
        throw 100;
    }
    else {
        throw "error";
    }
}

しかし、これを書くとVC2008で警告が出ます。

$ cl /W4 /EHs main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(4) : warning C4290: C++ の例外の指定は無視されます。関数が __declspec(n
othrow) でないことのみ表示されます。
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj

と、いったように動作が不安定なのでとりあえずあとは元記事を読んで終わりにしたいと思います。