C++教科書/標準ライブラリ編/<system_error>の章

編集

はじめに

編集

<system_error> ヘッダーは、オペレーティングシステムやその他の低レベル API から発生するエラー状況を報告するためのメカニズムを提供します。エラーを構造化された方法で表現し処理することで、コードの可読性と保守性を向上させます。

エラーカテゴリ (error_category クラス):

編集
  • エラーのソースと種類を識別するための基底クラスとして機能します。
  • プログラムは、標準の generic_categorysystem_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 例外がスローされ、エラーコードとメッセージが表示されます。