C++教科書/標準ライブラリ編/<stdexcept>の章

編集

19.2 例外クラス (std.exceptions)

編集

19.2.1 一般 (std.exceptions.general)

編集
  1. C++標準ライブラリでは、C++プログラムにおける特定のエラー(16.4.6.13)を報告するためのクラスが提供されています。これらのクラスに反映されているエラーモデルでは、エラーは論理エラーとランタイムエラーの2つの広い範疇に分けられています。
  2. 論理エラーの特徴は、プログラムの内部論理のエラーが原因であることです。理論的には、これらは防止可能です。
  3. 一方、ランタイムエラーは、プログラムの範囲を超えた出来事が原因です。これらは事前に簡単に予測できません。ヘッダー<stdexcept>では、C++プログラムのエラーを報告するためのいくつかの既定義例外の型が定義されています。これらの例外は継承関係にあります。
この節では、C++プログラムにおけるエラー報告のための例外クラスについて説明しています。論理エラーとランタイムエラーの2種類に分けられており、それぞれのエラー種別に対応する例外クラスが定義されています。

19.2.2 ヘッダー<stdexcept>の概要 (stdexcept.syn)

編集
namespace std {
    class logic_error;
    class domain_error; 
    class invalid_argument;
    class length_error;
    class out_of_range;
    class runtime_error;
    class range_error;
    class overflow_error;
    class underflow_error;
}
この節では、<stdexcept>ヘッダーに含まれる例外クラスの一覧が示されています。

事後条件

編集

C++の<stdexcept>ヘッダーにおける事後条件(Postconditions)とは、そのメンバー関数が実行された後に満たされるべき条件のことを指します。

具体的には、各例外クラスのコンストラクタにおいて、以下のような事後条件が定義されています。

logic_error(const string& what_arg);
// 事後条件: strcmp(what(), what_arg.c_str()) == 0.

logic_error(const char* what_arg);
// 事後条件: strcmp(what(), what_arg) == 0.

この事後条件は、コンストラクタが実行された後、例外オブジェクトのwhat()メンバー関数の返す文字列が、コンストラクタに渡されたwhat_argと同一であることを保証しています。

つまり、これらの事後条件は、例外オブジェクトが適切に初期化されたことを保証する役割があります。プログラマーは事後条件を意識することで、例外オブジェクトが意図したとおりに構築されていることを確認できます。

事後条件はプログラムの正確性を保証するための重要な概念です。<stdexcept>ヘッダーでは、各例外クラスのコンストラクタについて事後条件が明示的に定義されています。

19.2.3 logic_errorクラス (logic.error)

編集
namespace std {
class logic_error : public exception {
public:
    explicit logic_error(const string& what_arg);
    explicit logic_error(const char* what_arg); 
};
}
  1. logic_errorクラスは、プログラムの実行前に検出可能であろう論理的な前提条件やクラス不変条件の違反などのエラーを報告する例外オブジェクトの型を定義します。
    logic_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    logic_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、logic_errorクラスについて説明しています。このクラスは、プログラム実行前に検出可能な論理的なエラーを報告するための例外オブジェクトの型を定義しています。

19.2.4 domain_errorクラス (domain.error)

編集
namespace std {
class domain_error : public logic_error {
public:
    explicit domain_error(const string& what_arg);
    explicit domain_error(const char* what_arg);
};
}
  1. domain_errorクラスは、実装によってドメインエラーを報告する例外オブジェクトの型を定義します。
    domain_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    domain_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、domain_errorクラスについて説明しています。このクラスは、ドメインエラー(関数の定義域外の値が渡された場合など)を報告するための例外オブジェクトの型を定義しています。

19.2.5 invalid_argumentクラス (invalid.argument)

編集
namespace std {
class invalid_argument : public logic_error {
public:
    explicit invalid_argument(const string& what_arg);
    explicit invalid_argument(const char* what_arg);
};
}
  1. invalid_argumentクラスは、無効な引数を報告する例外オブジェクトの型を定義します。
    invalid_argument(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    invalid_argument(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、invalid_argumentクラスについて説明しています。このクラスは、無効な引数が渡された場合にそれを報告するための例外オブジェクトの型を定義しています。

19.2.6 length_errorクラス (length.error)

編集
namespace std {
class length_error : public logic_error {
public:
    explicit length_error(const string& what_arg);
    explicit length_error(const char* what_arg);
};
}
  1. length_errorクラスは、オブジェクトの長さが最大許容サイズを超えた試みを報告する例外オブジェクトの型を定義します。
    length_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    length_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、length_errorクラスについて説明しています。このクラスは、作成しようとしているオブジェクトの長さが最大許容サイズを超えた場合に、それを報告するための例外オブジェクトの型を定義しています。

19.2.7 out_of_rangeクラス (out.of.range)

編集
namespace std {
class out_of_range : public logic_error {
public:
    explicit out_of_range(const string& what_arg);
    explicit out_of_range(const char* what_arg);
};
}
  1. out_of_rangeクラスは、引数値が期待される範囲外であることを報告する例外オブジェクトの型を定義します。
    out_of_range(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    out_of_range(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、out_of_rangeクラスについて説明しています。このクラスは、渡された引数値が期待される範囲外の値である場合に、それを報告するための例外オブジェクトの型を定義しています。

19.2.8 runtime_errorクラス (runtime.error)

編集
namespace std {
class runtime_error : public exception {
public:
    explicit runtime_error(const string& what_arg);
    explicit runtime_error(const char* what_arg);
};
}
  1. runtime_errorクラスは、プログラムの実行時にのみ検出可能であろうエラーを報告する例外オブジェクトの型を定義します。
    runtime_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    runtime_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、runtime_errorクラスについて説明しています。このクラスは、プログラムの実行時にのみ検出可能なエラーを報告するための例外オブジェクトの型を定義しています。

19.2.9 range_errorクラス (range.error)

編集
namespace std {
class range_error : public runtime_error {
public:
    explicit range_error(const string& what_arg);
    explicit range_error(const char* what_arg);
};
}
  1. range_errorクラスは、内部計算におけるレンジエラーを報告する例外オブジェクトの型を定義します。
    range_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    range_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、range_errorクラスについて説明しています。このクラスは、プログラムの内部計算においてレンジエラー(値が許容範囲外である場合など)が発生した際に、それを報告するための例外オブジェクトの型を定義しています。

19.2.10 overflow_errorクラス (overflow.error)

編集
namespace std {
class overflow_error : public runtime_error {
public:
    explicit overflow_error(const string& what_arg);
    explicit overflow_error(const char* what_arg);
};
}
  1. overflow_errorクラスは、算術オーバーフローエラーを報告する例外オブジェクトの型を定義します。
    overflow_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    overflow_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、overflow_errorクラスについて説明しています。このクラスは、算術演算においてオーバーフローエラーが発生した場合に、それを報告するための例外オブジェクトの型を定義しています。

19.2.11 underflow_errorクラス (underflow.error)

編集
namespace std {
class underflow_error : public runtime_error {
public:
    explicit underflow_error(const string& what_arg);
    explicit underflow_error(const char* what_arg);
};
}
  1. underflow_errorクラスは、算術アンダーフローエラーを報告する例外オブジェクトの型を定義します。
    underflow_error(const string& what_arg);
  2. 事後条件: strcmp(what(), what_arg.c_str()) == 0.
    underflow_error(const char* what_arg);
  3. 事後条件: strcmp(what(), what_arg) == 0.
この節では、underflow_errorクラスについて説明しています。このクラスは、算術演算においてアンダーフローエラーが発生した場合に、それを報告するための例外オブジェクトの型を定義しています。