C++教科書/標準ライブラリ編/<exception>の章
編集はじめに
編集この章では、C++ 標準ライブラリに含まれる <exception>
ヘッダーについて解説します。このヘッダーは、エラー処理ライブラリの一部であり、プログラム実行中に発生した例外を捕捉、伝達するための機能を提供します。
ヘッダーの概要
編集<exception>
ヘッダーは、以下の機能を提供します。
- 例外が発生した際の捕捉、伝達
- 標準ライブラリで発生する例外の基底クラスの提供
- 例外を保持するための型
- 例外を扱う関数
型
編集<exception>
ヘッダーでは、以下の例外を扱うための型が定義されています。
exception
- 標準ライブラリのコンポーネントによって投げられる例外の基底クラスです。
nested_exception
(C++11)- 現在の例外を捕捉して保持するためのミックスイン型です。
bad_exception
std::current_exception
が例外オブジェクトの複製に失敗した場合に投げられる例外です。unexpected_handler
(C++17で削除)std::unexpected
によって呼び出される関数の型です。terminate_handler
std::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_terminate
std::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()
メンバー関数を使用して、内部に保持している例外を再び投げることができます。