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_exceptionuncaught_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() メンバー関数を使用して、内部に保持している例外を再び投げることができます。