最近、一部のライブラリをC++ 11の<system_error>
機能を使用するように変換しています。
std::error_code
とstd::error_condition
の使用例を理解できません。
注、違いを理解しています- stackoverflowに関する多くの質問 が違いを超えています。
基本的な違いは、std::error_code
はシステムまたはプラットフォーム固有のエラーを表すことになっていますが、std::error_condition
はAPIまたはユーザーインターフェイスが返す抽象エラーです。
わかりました-しかし、実際にstd::error_code
を使用する理由を理解できません。あなたはどちらかに行くようです:
システム固有のエラー報告メカニズム(たとえば、errno
またはPOSIX呼び出しから返されたもの、またはLinux上のSO_ERROR
を使用したgetsockopt
への呼び出しなど)を処理している移植性があると思われるstd::error_condition
列挙型を介してstd::errc
に簡単に変換できます。
「無効な社会保障番号」などのアプリケーションレベルのエラーまたはビジネスロジックのエラーを表す、ユーザー定義のエラーのカテゴリを使用している-std::error_condition
の使用例でもあります。
OpenSSLなどの独自のエラー報告メカニズムを定義する低レベルのインターフェイスまたはライブラリを処理します。この場合、プラットフォーム固有のエラーメカニズムを直接使用します。この場合、これらのエラーをstd::error_code
に変換またはマッピングする必要があります。しかし、これらのプラットフォーム固有のエラーをstd::error_code
などの一般的なものに変換する問題を経験する場合は、std::error_condition
に変換しないでください。
また、POSIXシステムエラーは移植可能であることが想定されており、std::error_condition
列挙型を介してstd::errc
と1対1でマッピングされるため、std::error_code
のユースケースを見つけることができません。ほとんどのLinux/UNIXシステムは、set errno
を呼び出します。これは、移植可能なようにstd::error_condition
にマップされることになっています。
そのため、std::error_code
のユースケースはどこにも見当たりません。それでは、std::error_code
の代わりにstd::error_condition
を使用したい場合の使用例は何ですか?
私はしばらくの間それについて疑問に思っていて、答えを見つけました here 。基本的に、error_code
はエラーコードの格納と転送に使用され、error_condition
はエラーコードの照合に使用されます。
void handle_error(error_code code) {
if (code == error_condition1) do_something();
else if(code == error_condition2) do_something_else();
else do_yet_another_thing();
}
各error_condition
は、error_code
のセットに相当します。異なるerror_categories
からのものである可能性があります。このようにして、特定のタイプのすべてのエラーを、発生元のサブシステムに関係なく同じように処理できます。
一方、error_code
には、元のサブシステムのカテゴリが正確に含まれています。これはデバッグやエラーの報告に役立ちます。「アクセスが拒否されました」エラーがローカルファイルシステムへのアクセス権が不十分なためか、http-downloader-libraryが受け取った403エラーが原因だったのかを知りたい場合があります。エラーメッセージにその詳細を含めることもできますが、プログラムはどちらかの方法で中止する必要があります。
同等性を構成するものは、カテゴリーによって定義されます。 error_code
のカテゴリがerror_condition
と同等と見なす場合、またはerror_condition
のカテゴリがerror_code
と見なす同等の場合、operator==
は、そのerror_condition
とerror_code
のペアに対してtrue
を返します。これにより、独自のエラーカテゴリからerror_code
sを取得し、特定のジェネリックまたはシステムerror_condition
sと同等にすることができます。
このブログ 必要なものをカバーしています
そしてこれを読むこともできます "あなた自身のエラーコード"