Я пишу библиотеку и хочу возвращать коды ошибок всякий раз, когда ошибка возвращается удаленной системой. Проблема состоит в том, что они идентифицируются строками, например, «0A01», и также содержат сообщение, а код ошибки требует целое число в качестве значения.
Каков наилучший способ реализации кода ошибки со всеми функциями, которые std::error_code
обеспечивает, но что использует строки в качестве значения? Как добавить строку внешней ошибки в std::error_code
или же std::error_category
?
Как уже упоминалось в комментариях, вы должны знать коды ошибок, которые могут быть получены с удаленного сервера.
std::string
который вы получаете от удаленного сервера, состоит из 2 частей, как вы сказали,
Проблема состоит в том, что они идентифицируются строками, например, «0A01», и также содержат сообщение, а код ошибки требует целое число в качестве значения.
Поскольку вы не указали формат сообщения об ошибке, я не добавляю код для его разбивки, разбейте вашу строку на 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.");
Не наследуйте код ошибки. Вам нужно написать свою собственную категорию ошибок, которая отображает целые числа на ваши конкретные ошибки. Это пошаговое описание того, как это сделать:
http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-4.html