最終更新日時:
が更新

履歴 編集

<stdexcept>

stdexcept

<stdexcept>ヘッダは、標準的な例外クラスを提供する。
これらの例外クラスは、標準ライブラリ内でも使用されている。

これらのクラス群に反映されているエラーモデルでは、エラーは「実行時エラー (runtime error) 」と「論理エラー (logic error) 」との2つに大別される。
論理エラーを区別するための性質は、それがプログラムの内部的論理の誤りに起因することである。理論的には、それらは予め避けることができる。
対して、実行時エラーはプログラムの制御の及ばない事象に起因する。それらを前もって簡単に予見することはできない。

このヘッダで提供される例外クラスは以下の表の通りである。以下のクラスは全て、std名前空間で提供される。

名前 説明 対応バージョン
logic_error プログラムの実行前に検出可能なエラー(論理エラー)を示す
domain_error 定義域エラーを示す
invalid_argument 不正な引数を示す
length_error 長すぎるオブジェクトを作ろうとしたことを示す
out_of_range 引数が許容範囲外であることを示す
runtime_error プログラム実行時にのみ検出可能なエラー(実行時エラー)を示す
range_error 内部計算によって、値が範囲外になったことを示す(値域エラー)
overflow_error 数値計算の結果がオーバーフローしたことを示す
underflow_error 数値計算の結果がアンダーフローしたことを示す

例外クラスには継承関係があり、以下の箇条書きの階層構造で示す。

  • exception
    • logic_error
      • domain_error
      • invalid_argument
      • length_error
      • out_of_range
    • runtime_error
      • range_error
      • overflow_error
      • underflow_error

exceptionクラスを除く9つのクラスは、すべて同じpublicメンバ関数をもつ。

クラス名をTとすると、以下のpublicメンバ関数をもつ。

メンバ関数

名前 説明 対応バージョン
explicit T(const string& what_arg); 指定したメッセージを持つ例外オブジェクトを生成する
explicit T(const char* what_arg); 指定したメッセージを持つ例外オブジェクトを生成する C++11
virtual const char* what() const noexcept; メッセージを取得する

ここでは、簡単な例外処理の例を示す。

#include <stdexcept>
#include <iostream>
#include <cstdlib> // exit

void f()
{
  // 例外を投げる
  throw std::logic_error("an exception occurred");
}

int main()
{
  try {
    f();
  }
  catch (const std::logic_error& e) {
    // 例外が発生した!
    std::cout << e.what() << std::endl;
    exit(1);
  }
}

参照