web-dev-qa-db-fra.com

Cas d'utilisation pour std :: error_code

Dernièrement, j'ai converti certaines bibliothèques pour qu'elles utilisent les fonctionnalités <system_error> de C++ 11.

J'ai de la difficulté à comprendre les cas d'utilisation de std::error_code par rapport à std::error_condition

Note, Je comprends la différence - il y a beaucoup de questions sur stackoverflow qui vont sur la différence. 

La différence fondamentale est que std::error_code est supposé représenter une erreur spécifique au système ou à la plate-forme, alors que std::error_condition est une erreur abstraite qu'une API ou une interface utilisateur doit renvoyer.

D'accord - mais j'ai du mal à comprendre pourquoi nous utiliserions jamais std::error_code en pratique. Il me semble que vous allez soit:

  1. Traitez avec un mécanisme de rapport d’erreur spécifique au système (comme Par exemple, errno ou quelque chose qui est retourné d’un appel POSIX, ou appelez À getsockopt avec SO_ERROR sous Linux) que vous pouvez facilement convertir en un std::error_condition via les énumérations std::errc, censées être portables.

  2. Utilisez une catégorie d’erreurs définie par l’utilisateur, qui représente des erreurs au niveau de l’application Ou de la logique commerciale, comme "numéro de sécurité sociale invalide" ou , Ce qui constituerait également un cas d’utilisation pour std::error_condition.

  3. Traitez avec une interface ou une bibliothèque de bas niveau qui définit son propre mécanisme de rapport d'erreur, tel que OpenSSL, auquel cas vous utiliseriez directement des mécanismes d'erreur spécifiques à la plate-forme. Dans ce cas, vous devez ensuite convertir ou mapper ces erreurs en un std::error_code. Mais si vous avez le problème de convertir ces erreurs spécifiques à une plate-forme en quelque chose de générique tel que std::error_code, pourquoi ne pas simplement convertir en std::error_condition?

De plus, étant donné que les erreurs système POSIX sont supposées être portables, et puisqu'elles mappent un à un avec std::error_condition via l'énumération std::errc, je ne trouve aucun cas d'utilisation pour std::error_code. La plupart des appels système Linux/UNIX définissent errno, qui est supposé mapper de manière portable sur std::error_condition.

Donc, je ne vois aucun cas d'utilisation de std::error_code nulle part. Alors, quels sont quelques exemples de cas où nous voudrions utiliser std::error_code au lieu de std::error_condition?

17
Siler

Je me posais cette question il y a quelque temps déjà et j'ai trouvé la réponse ici . error_code est essentiellement utilisé pour stocker et transporter les codes d'erreur, alors que error_condition est utilisé pour faire correspondre les codes d'erreur.

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();
}

Chaque error_condition équivaut à un ensemble de error_code, éventuellement de error_categories différent. De cette façon, vous pouvez traiter toutes les erreurs d’un certain type de la même manière, quel que soit le sous-système d’origine.

error_code, en revanche, contient exactement la catégorie du sous-système d'où il provient. Ceci est utile pour le débogage et pour signaler l'erreur: vous voudrez peut-être savoir si l'erreur "autorisation refusée" est due à des droits d'accès insuffisants sur le système de fichiers local ou à une erreur 403 reçue par votre http-downloader-library, et peut vouloir mettre ce détail dans le message d'erreur, mais votre programme doit abandonner de toute façon.

Ce qui constitue l’équivalence est défini par les catégories; si la catégorie error_code considère l'équivalent error_condition, ou la catégorie error_condition considère l'équivalent error_code, alors operator== renvoie true pour cette paire de error_condition et error_code. De cette façon, vous pouvez avoir error_codes de votre propre catégorie d'erreur et les rendre équivalents à certains error_conditions génériques ou système.

17
ex-bart

ce blog couvre ce dont vous avez besoin

et vous pouvez également lire ceci "Votre propre code d'erreur"

0