C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① ある関数が、std::runtime_error の派生クラスの例外オブジェクトを複数種類、送出する可能性があるとき、それらを捕捉するコードを書いてください。このとき、どの例外オブジェクトでも同じ処理で良い場合と、それぞれ異なる処理が必要になる場合とを考えてみてください。
例外オブジェクトを送出する適当な実験関数を作っておきます。
#include <stdexcept>
void func(int n)
{
switch (n) {
case 0:
throw std::range_error("range_error");
case 1:
throw std::overflow_error("overflow_error");
case 2:
throw std::underflow_error("underflow_error");
}
}
どの例外オブジェクトであっても、捕捉時の処理が変わらないのであれば、共通の基底クラスである std::runtime_error型で捕捉するのが簡単ですし、漏れが無くて安全です。なお、継承構造にあるクラスなので、スライシングを防ぐため、参照型で受け取るのが基本です。
int main()
{
try {
(0);
func}
catch (const std::runtime_error& e) {
std::cerr << e.what() << std::endl;
}
}
実行結果:
range_error
一方、それぞれで処理を変えたいのなら、1つずつ捕捉するコードが必要です。
int main()
{
try {
(0);
func}
catch (const std::range_error&) {
std::cerr << "範囲エラーが発生しました。" << std::endl;
}
catch (const std::overflow_error&) {
std::cerr << "オーバーフローが発生しました。" << std::endl;
}
catch (const std::underflow_error&) {
std::cerr << "アンダーフローが発生しました。" << std::endl;
}
}
実行結果:
範囲エラーが発生しました。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |