web-dev-qa-db-ja.com

std :: error_codeの使用例

最近、一部のライブラリをC++ 11の<system_error>機能を使用するように変換しています。

std::error_codestd::error_conditionの使用例を理解できません。

注、違いを理解しています- stackoverflowに関する多くの質問 が違いを超えています。

基本的な違いは、std::error_codeはシステムまたはプラットフォーム固有のエラーを表すことになっていますが、std::error_conditionはAPIまたはユーザーインターフェイスが返す抽象エラーです。

わかりました-しかし、実際にstd::error_codeを使用する理由を理解できません。あなたはどちらかに行くようです:

  1. システム固有のエラー報告メカニズム(たとえば、errnoまたはPOSIX呼び出しから返されたもの、またはLinux上のSO_ERRORを使用したgetsockoptへの呼び出しなど)を処理している移植性があると思われるstd::error_condition列挙型を介してstd::errcに簡単に変換できます。

  2. 「無効な社会保障番号」などのアプリケーションレベルのエラーまたはビジネスロジックのエラーを表す、ユーザー定義のエラーのカテゴリを使用している-std::error_conditionの使用例でもあります。

  3. 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を使用したい場合の使用例は何ですか?

23
Siler

私はしばらくの間それについて疑問に思っていて、答えを見つけました 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_conditionerror_codeのペアに対してtrueを返します。これにより、独自のエラーカテゴリからerror_codesを取得し、特定のジェネリックまたはシステムerror_conditionsと同等にすることができます。

22
ex-bart

このブログ 必要なものをカバーしています

そしてこれを読むこともできます "あなた自身のエラーコード"