Использование std :: error_code с нецелыми значениями

Я пишу библиотеку и хочу возвращать коды ошибок всякий раз, когда ошибка возвращается удаленной системой. Проблема состоит в том, что они идентифицируются строками, например, «0A01», и также содержат сообщение, а код ошибки требует целое число в качестве значения.

Каков наилучший способ реализации кода ошибки со всеми функциями, которые std::error_code обеспечивает, но что использует строки в качестве значения? Как добавить строку внешней ошибки в std::error_code или же std::error_category?

4

Решение

Как уже упоминалось в комментариях, вы должны знать коды ошибок, которые могут быть получены с удаленного сервера.
std::string который вы получаете от удаленного сервера, состоит из 2 частей, как вы сказали,

Проблема состоит в том, что они идентифицируются строками, например, «0A01», и также содержат сообщение, а код ошибки требует целое число в качестве значения.

Поскольку вы не указали формат сообщения об ошибке, я не добавляю код для его разбивки, разбейте вашу строку на 2 части,

  1. Код ошибки
  2. Сообщение об ошибке

Теперь вы можете конвертировать код ошибки типа std::string в int используя std::stoi(error_code)Так скажем

int error_code_int = std::stoi(string_to_hexadecimal(error_code));

И для std::error_category который служит базовым классом для наших пользовательских сообщений об ошибках, сделайте это,

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

Выход для приведенного выше рабочего примера

Error Category Name : 0A01
This is the message which received from remote server.

Вы можете использовать функцию string_to_hexadecimal() от эта почта.

Я надеюсь, что теперь вы можете изменить приведенный выше код в соответствии с вашими потребностями.

Изменить 1:

Как вы сказали, что:

Это предполагает, что динамическое сообщение является глобальным значением. Как мне пройти это
для std::error_category объект?

Вы можете видеть, что оба std::error_code::assign и конструктор std::error_code::error_code принимают параметры int для номера кода ошибки и error_category, Так что очевидно, что std::error_code не может принять динамическое сообщение.

Но подожди, я сказал std::error_code принимают error_category в качестве аргумента в конструкторе, так есть ли способ, мы можем назначить динамическое сообщение там?

std::error_category говорится, что:

std::error_category служит базовым классом для конкретной ошибки
типы категорий.

Так что это означает, что struct мы получили от std::error_category на следующей строке

struct OurCustomErrCategory : std::error_category

может иметь элемент данных, и мы можем назначить его через функцию-член, поэтому наш struct станет таким,

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

и вы можете назначить его так, как вы хотите,

const OurCustomErrCategory ourCustomErrCategoryObject("This is the message which received from remote server.");
3

Другие решения

Не наследуйте код ошибки. Вам нужно написать свою собственную категорию ошибок, которая отображает целые числа на ваши конкретные ошибки. Это пошаговое описание того, как это сделать:

http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-4.html

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector