C++教科書/標準ライブラリ編/<system_error>の章
編集はじめに
編集<system_error>
ヘッダーは、オペレーティングシステムやその他の低レベル API から発生するエラー状況を報告するためのメカニズムを提供します。エラーを構造化された方法で表現し処理することで、コードの可読性と保守性を向上させます。
エラーカテゴリ (error_category クラス):
編集- エラーのソースと種類を識別するための基底クラスとして機能します。
- プログラムは、標準の
generic_category
とsystem_category
に加えて、カスタムエラーカテゴリを派生させることができます。 - 仮想関数を提供します。
- エラーカテゴリの名前を指定する (
name()
) - 指定されたエラーコードのデフォルトのエラー条件を生成する (
default_error_condition(int ev)
) - エラーコードとエラー条件を比較する (
equivalent(int code, const error_condition& condition)
) とその逆 (equivalent(const error_code& code, int condition)
) - エラーコードの説明を提供する (
message(int ev)
)
- エラーカテゴリの名前を指定する (
エラーコード (error_code クラス):
編集- 通常、オペレーティングシステムまたは低レベル API からのエラーコードを表します。
- コンストラクタを使用して、エラー値とカテゴリを初期化できます。
error_code()
: 値 0 とsystem_category
で初期化error_code(int val, const error_category& cat)
: 値とカテゴリを設定error_code(ErrorCodeEnum e)
: ユーザー定義のErrorCodeEnum
型の場合
- メンバー関数:
value()
: エラーコード値を取得category()
: エラーカテゴリを取得default_error_condition()
: コードのデフォルトのエラー条件を取得message()
: エラーコードの説明を取得operator bool()
: エラーコードに値があるかどうか (非ゼロ) を確認
エラー条件 (error_condition クラス):
編集- 発生源 (OS、ユーザー定義など) に関係なく、エラー条件を表します。
- 初期化に
error_code
と同様のコンストラクタを使用します。 - メンバー関数:
value()
: エラー条件値を取得category()
: エラーカテゴリを取得message()
: エラー条件の説明を取得operator bool()
: エラー条件に値があるかどうか (非ゼロ) を確認
システムエラー (system_error クラス):
編集runtime_error
を継承し、システム関連エラー用の例外オブジェクトを提供します。- コンストラクタを使用して、エラーコードとオプションのメッセージを指定できます。
- メンバー関数:
code()
: 例外に関連付けられているエラーコードを取得what()
: 説明的なエラーメッセージを提供するためにオーバーライド
ヘルパー関数:
編集make_error_code(errc e)
: システムエラーコード (errc
列挙型) からerror_code
を作成します。make_error_condition(errc e)
: システムエラーコード (errc
列挙型) からerror_condition
を作成します。operator<< (ostream, const error_code&)
: カテゴリと値を提供する、エラーコードのストリーム挿入。
= 用例:
編集- C++
#include <fstream> #include <iostream> #include <system_error> auto main() -> int { try { // ファイルを開こうとする std::ifstream file("myfile.txt"); // エラーが発生しなかった場合、ファイル処理を実行 if (file.is_open()) { // ファイル処理 std::cout << "File opened successfully." << std::endl; } else { // エラーが発生した場合、システムエラー例外をスロー throw std::system_error( std::make_error_code(std::errc::bad_file_descriptor), "Failed to open file."); } } catch (const std::system_error& e) { // エラーコードとメッセージを取得して処理 std::cerr << "Error: " << e.code().value() << " - " << e.what() << std::endl; } return 0; }
この例では、ファイルを開く操作でエラーが発生した場合、system_error
例外がスローされ、エラーコードとメッセージが表示されます。