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