C++/標準ライブラリ/exception
表示
C++教科書/標準ライブラリ編/<exception>の章
[編集]はじめに
[編集]この章では、C++ 標準ライブラリに含まれる <exception> ヘッダーについて解説します。このヘッダーは、エラー処理ライブラリの一部であり、プログラム実行中に発生した例外を捕捉、伝達するための機能を提供します。
ヘッダーの概要
[編集]<exception> ヘッダーは、以下の機能を提供します。
- 例外が発生した際の捕捉、伝達
- 標準ライブラリで発生する例外の基底クラスの提供
- 例外を保持するための型
- 例外を扱う関数
型
[編集]<exception> ヘッダーでは、以下の例外を扱うための型が定義されています。
exception- 標準ライブラリのコンポーネントによって投げられる例外の基底クラスです。
nested_exception(C++11)- 現在の例外を捕捉して保持するためのミックスイン型です。
bad_exceptionstd::current_exceptionが例外オブジェクトの複製に失敗した場合に投げられる例外です。unexpected_handler(C++17で削除)std::unexpectedによって呼び出される関数の型です。terminate_handlerstd::terminateによって呼び出される関数の型です。exception_ptr(C++11)- 例外オブジェクトを扱うための共有ポインタ型です。
関数
[編集]<exception> ヘッダーは、例外を扱うための以下の関数を提供します。
unexpected(C++17で削除)- 動的例外仕様が違反した場合に呼び出される関数です。
uncaught_exception、uncaught_exceptions(C++20で削除) (C++17)- 現在、例外処理が進行中かどうかを調べます。
make_exception_ptr(C++11)- 例外オブジェクトから
std::exception_ptrを生成します。 current_exception(C++11)- 現在の例外を
std::exception_ptrにキャプチャします。 rethrow_exception(C++11)std::exception_ptrから例外を再び投げます。throw_with_nested(C++11)- 引数を
std::nested_exceptionにミックスインさせて投げます。 rethrow_if_nested(C++11)std::nested_exceptionから内部に格納されている例外を投げます。terminate- 例外処理が失敗した場合に呼び出される関数です。
get_terminate(C++11)- 現在の終了ハンドラを取得します。
set_terminatestd::terminateによって呼び出される関数を変更します。get_unexpected(C++17で削除)- 現在の unexpected_handler を取得します。
set_unexpected(C++17で削除)std::unexpectedによって呼び出される関数を変更します。
クラス std::exception
[編集]std::exception は、例外の基底クラスです。ほとんどの例外クラスはこのクラスから継承されます。what() メンバー関数を使用して、例外の詳細情報を取得することができます。
クラス std::bad_exception
[編集]std::bad_exception は、std::exception から継承された例外クラスで、std::current_exception が例外オブジェクトの複製に失敗した場合に投げられます。
クラス std::nested_exception (C++11)
[編集]std::nested_exception は、別の例外を内部に保持することができる例外クラスです。nested_ptr() メンバー関数を使用して、内部に保持している例外オブジェクトを取得することができます。rethrow_nested() メンバー関数を使用して、内部に保持している例外を再び投げることができます。