catchブロックを複数定義
chachブロックを定義する際throwする値の型を引数に指定する必要があります。
しかし、ここでオーバーロードを考えましょう。
C++では関数に関して、同じ名前でも引数の型が異なれば別の関数として区別できるんでしたね。
詳しくはデフォルト引数と関数のオーバーロードを参照。
catchブロックについても同じことが言えます。
つまり、1つのtryブロックに対して引数の異なるcatchブロックを複数定義し、throwする型によって処理を振り分けることもできます。
catch文の中にswitch文を書けば、throwした値によって処理を振り分けることができます。
ですが、こちらの方法を使えば、型変換を行うことによってユーザーの入力したデータの型によって処理を振り分けることができます。
指定したどの型にも当てはまらない場合の処理を
catch(...) { }
と書くことで受け取ることができます。
switch文でいうdefaultですね。
サンプルコード
throwした値によって処理を変えるコードのサンプルです。
まずはswitch文を用いた方法。
catch_sample1.cpp
#include#include #include using namespace std; int main(void) { try { double input; cout << "正の整数を入力:"; cin >> input; if (input < 0) throw 0; if (ceil(input) != floor(input)) throw 1; cout << "正しい入力値です" << endl; } catch (int e) { switch (e) { case 0:cout << "正の値ではありません" << endl; break; case 1:cout << "整数ではありません" << endl; break; default:break; } } return 0; }
もう一つは今回の型を変える方法です。
catch_sample2.cpp
#include#include #include using namespace std; int main(void) { try { double input; cout << "正の整数を入力:"; cin >> input; if (input < 0) throw 0; if (ceil(input) != floor(input)) throw 'e'; cout << "正しい入力値です" << endl; } catch (int) { cout << "正の値ではありません" << endl; } catch (char) { cout << "整数ではありません" << endl; } return 0; }
どちらのコードでも同様の処理を行います。
因みにですが、負の小数を入力した場合は「正の値ではありません」が表示されます。