system error


概要

system errorとは、 OSなどのシステムコールや低レベルのAPIを使用するライブラリが、システムコールなどで発生したエラーを通知するための例外機能である。 簡単に言えば、errnoやperrorの機能をC++用に置き換えて、さらに拡張性を加えたものである。 C++11では、Iostreamや、スレッド関連で使用されている。

system errorは幾つかのクラスに分かれており、error_categoryerror_codeerror_conditionsystem_errorというクラスが存在する。

本節で解説する機能を使用するには、ヘッダファイル system_errorをインクルードする。

error_category

エラーコードの発生源や特定のエラーカテゴリを識別するためのベースクラスである。 基本的に既に定義されている一般カテゴリ, システムカテゴリを使用することになる。 また、ユーザが新たに定義することも可能でありその場合はerror_categoryクラスを継承させる。 独自のerror_categoryを定義することで、プログラム毎の独自エラーコードとエラーメッセージの対応を定義することができる。 一般カテゴリは、POSIXで定義された errno (ヘッダファイルcerrorに定義されているもの)に関連するエラーで使用される。 システムカテゴリは、OS毎に独立したエラーを示す場合に使用される。

これらのカテゴリはそれぞれ、以下の関数を用いて取得する。error_categoryは、参照でオブジェクトのやり取りする。 そのため、 これらの関数は常に同じオブジェクトを返却する。(つまり同じアドレスを持つ) 独自のerror_categoryを定義した場合でも、同じカテゴリは同じアドレスを持つように定義すべきである。

  • const error_category& generic_category() noexcept;
  • const error_category& system_category() noexcept;

以下に、独自のerror_categoryを定義する場合の例を示す。

#include <system_error>
#include <map>
#include <string>
#include <iostrem>

enum class my_error {
    no_error = 0,
    error = 1,
};

class MyErrorCategory : public std::error_category {
public:
    MyErrorCategory() : std::error_category() {}
    const char* name() const noexcept
    { return "my_error"; }

    std::string message(int ev) const
    { return msg.at(ev); }

private:
    std::map<int, std::string> msg = { {0,"no error"}, {1, "error occured"} };
};

static MyErrorCategory my_error_category;

const std::error_category& my_category() noexcept
{ return my_error_category; }

std::error_code make_error_code(my_error me) noexcept
{ return std::error_code(static_cast<int>(me), my_category()); }



int main() {
    std::error_code ec = make_error_code(my_error::no_error);
    std::cout << ec.message() << std::endl;
    ec = make_error_code(my_error::error);
    std::cout << ec.message() << std::endl;
    return 0;
}
error_code

環境依存のエラーコード値を保持するクラス。system_errorオブジェクトを構築する際に使用する。 error_codeクラスには、エラーコード値と、error_categoryオブジェクトを指定する。 このクラスを使用することで、エラーコード値に対応するエラーメッセージなどを取得することができる。

POSIX定義のエラーコードを使用する場合、std::errcに列挙子として定義されている。 このエラーコードを使用する場合、一般カテゴリのerror_categoryを指定する。

#include <system_error>
#include <iostream>

int main() {
    std::error_code ec { static_cast<int>(std::errc::no_such_file_or_directory),
                         std::generic_category() };
    std::cout << ec.value() << std::endl;               //2
    std::cout << ec.message() << std::endl;             //No such file or directory
    return 0;
}
error_condition

エラー状態を識別する環境非依存の値を保持するクラス。 error_conditionは、環境非依存のエラー値を保持するという点以外は、error_codeと同じである。

system_error

環境依存のエラー情報を表現する 例外(exception) である。環境依存のエラーを表現するため、error_code を保持する。 なお、コンストラクタ時に指定する "what_arg" 引数により what() 時の表現を変更することも可能である。 概ね whart_arg + ": " + code.message() のような表現となる。

#include <system_error>
#include <iostream>

int main() {
    std::error_code ec { 2, std::generic_category() };
    std::system_error exception(ec, "c++11");
    std::cout << exception.what() << std::endl;
    return 0;
c++11: No such file or directory

results matching ""

    No results matching ""