例外クラス 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第17章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも 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 {
        func(0);
    }
    catch (const std::runtime_error& e) {
        std::cerr << e.what() << std::endl;
    }
}

実行結果

range_error

一方、それぞれで処理を変えたいのなら、1つずつ捕捉するコードが必要です。

int main()
{
    try {
        func(0);
    }
    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;
    }
}

実行結果

範囲エラーが発生しました。


参考リンク


更新履歴

’2016/11/5 新規作成。



第17章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る