Comme mentionné dans les commentaires, vous devez connaître les codes d'erreur, ce qui pourrait être reçue du serveur distant. Le std::string
que vous recevez à partir d'un serveur distant contient 2 parties que vous avez dit,
Le problème est que ceux-ci sont identifiés par des chaînes, par exemple, « 0A01 » et contiennent également un message, et le code d'erreur nécessite un entier comme valeur.
Comme vous ne l'avez pas partagé le format du message d'erreur, je ne suis pas d'ajouter le code pour spiting il, diviser votre chaîne en 2 parties,
- Code d'erreur
- Message d'erreur
maintenant, vous pouvez convertir le code d'erreur de type std::string
à int
en utilisant std::stoi(error_code)
, permet donc dire
int error_code_int = std::stoi(string_to_hexadecimal(error_code));
Et pour std::error_category
qui sert de classe de base pour nos messages d'erreur personnalisés, faites ceci,
std::string message_received = "This is the message which received from remote server.";
struct OurCustomErrCategory : std::error_category
{
const char* name() const noexcept override;
std::string message(int ev) const override;
};
const char* OurCustomErrCategory::name() const noexcept
{
return "Error Category Name";
}
std::string OurCustomErrCategory::message(int error_code_int) const
{
switch (error_code_int)
{
case 1:
return message_received;
default:
return "(unrecognized error)";
}
}
const OurCustomErrCategory ourCustomErrCategoryObject;
std::error_code make_error_code(int e)
{
return {e, ourCustomErrCategoryObject};
}
int main()
{
int error_code_int = std::stoi(string_to_hexadecimal(error_code)); // error_code = 0A01
ourCustomErrCategoryObject.message(error_code_int);
std::error_code ec(error_code_int , ourCustomErrCategoryObject);
assert(ec);
std::cout << ec << std::endl;
std::cout << ec.message() << std::endl;
}
La sortie ci-dessus exemple de travail est
Error Category Name : 0A01
This is the message which received from remote server.
Vous pouvez utiliser la fonction string_to_hexadecimal()
de this post .
J'espère que maintenant vous pouvez modifier le code ci-dessus en fonction de vos besoins.
Edit 1:
Comme vous avez dit que:
Cela suppose le message dynamique est une valeur globale. Comment est-ce que je le passe à un objet std::error_category
?
Vous pouvez voir que les deux std::error_code::assign
et constructeur std::error_code::error_code
prennent des paramètres de int
pour le numéro de code d'erreur et error_category
.Il est donc évident que std::error_code
ne peut pas prendre le message dynamique.
Mais attendez, j'ai dit std::error_code
prennent error_category
comme argument dans le constructeur, donc est-il possible d'y assigner le message dynamique?
std::error_category
affirme que:
std::error_category
sert de classe de base pour erreur spécifique types de catégorie.
Cela veut donc dire que le struct
nous dérivé de std::error_category
à la ligne suivante
struct OurCustomErrCategory : std::error_category
peut avoir un membre de données et nous pouvons l'affecter via la fonction membre, notre struct
deviendra comme ça,
struct OurCustomErrCategory : std::error_category
{
std::string message_received;
OurCustomErrCategory(std::string m) : message_received(m) {}
const char* name() const noexcept override;
std::string message(int ev) const override;
};
et vous pouvez l'assigner comme ça partout où vous voulez,
const OurCustomErrCategory ourCustomErrCategoryObject("This is the message which received from remote server.");
Exceptions? --- – Quentin
J'aimerais utiliser error_codes. Convient mieux avec le flux de l'application. – ruipacheco
S'il existe un nombre fixe de ces codes de chaîne, vous pouvez les mapper en valeurs entières (d'autant qu'elles ressemblent à des valeurs hexadécimales) et utiliser de toute façon 'std :: error_code'. Autrement écrire une classe avec deux champs de chaîne ne devrait pas être difficile du tout. – freakish