C++/標準ライブラリ/system error
表示
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 例外がスローされ、エラーコードとメッセージが表示されます。