ホームに戻る
出典 :
例外クラス | Programming Place Plus C++編【標準ライブラリ】 第17章 exception - cpprefjp C++日本語リファレンス
関連 :
例外処理
目次 :

C++標準の例外クラス

C++の標準ライブラリには、例外として送出するためのクラス(例外オブジェクト)が定義されている。
いずれも std 名前空間に属しており、exception から派生する。
クラス名 インクルード
するヘッダ
解説
std::exception <exception> 以下のすべての例外クラスをラップできる。
std::bad_alloc <new> new 演算子が失敗した際に送出される。
std::bad_cast <typeinfo> 参照に対する dynamic_cast が失敗した際に送出される。
std::bad_typeid <typeinfo> typeid 演算子にヌルポインタを渡した際に送出される。
std::bad_exception <exception> 例外指定で指定されていない種類の例外を送出した際に用いられる。
std::ios_base::failure <ios> 入出力ストリームでのエラー時に送出される。
std::logic_error <stdexcept> 論理的なエラーを表現。以下のクラスは主に、関数の引数が不正である場合に送出される。
std::out_of_range logic_error から派生。
関数が受け取った引数が有効範囲外である場合に送出される。
std::invalid_argument logic_error から派生。
関数が受け取った引数が意味的に不正である場合に送出される。
例) bitset にビットを表現しない値を渡そうとした
std::length_error logic_error から派生。
長さが上限を超えた場合に送出される。
例) 文字列の結合により、max_size() で取得できる最大長を超えてしまった
std::domain_error logic_error から派生。
logic_error から派生する他の例外のいずれにも当てはまらない場合に使用される。
但し標準規格として、このクラスから作られた例外が送出される場面は存在しない。
std::runtime_error <stdexcept> 実行時にしか検出できないエラーを表現。以下のクラスは主に、演算を行った際にエラーが発生すると送出される。
std::range_error runtime_error から派生。
演算により範囲エラーが発生した場合に送出される。
std::overflow_error runtime_error から派生。
数値演算でオーバーフローが発生した場合に送出される。
std::underflow_error runtime_error から派生。
数値演算でアンダーフローが発生した場合に送出される。

例外クラスの捕捉(catch)

前述の例外クラスはいずれも std::exception から派生しているため、すべて std::exception で捕捉できる。
これは std::exception (およびその派生クラス)を継承するユーザ定義クラスを作成した場合も同様である。
std::exception のメンバ関数である what() は、例外の内容を表す文字列を返す。但し、戻り値は環境に依存するため一定ではない。
what() は仮想関数であるため、ユーザ定義クラスでオーバーライドすることも可能である。

例外オブジェクト捕捉の例 :

#include <iostream> #include <exception> #include <stdexcept> //< std::runtime_error を使用するために必要 void main() { try { : // std::runtime_error を送出 // (例外メッセージを指定) throw std::runtime_error("エラーが発生しました。"); } // 例外捕捉 // (std::exception として) catch (std::exception& e) { // エラー理由( what() )を出力する std::cout << e.what() << std::endl; } }
実行結果 :
エラーが発生しました。