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:
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.
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
.
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
?
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_code
s de votre propre catégorie d'erreur et les rendre équivalents à certains error_condition
s génériques ou système.
ce blog couvre ce dont vous avez besoin
et vous pouvez également lire ceci "Votre propre code d'erreur"