今回は複数の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を書く事も出来ます。
<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はありません。
が、引数を「...」にする事できちんと「捕まえる」事が出来ています。
引数に「...」を指定する事で、どんな型の例外でも「捕まえる」事が出来るようになるのです。