使用带有非整数值的std :: error_code

时间:2017-05-08 20:18:52

标签: c++ c++11 error-code

我正在编写一个库,并希望在远程系统返回错误时返回错误代码。问题是这些是由字符串标识的,例如" 0A01"并且还包含一条消息,错误代码需要一个整数作为值。

实现错误代码的最佳方法是什么,std::error_code提供但使用字符串作为值的所有功能?如何将外部错误字符串添加到std::error_codestd::error_category

2 个答案:

答案 0 :(得分:3)

如评论中所述,您必须知道可以从远程服务器接收的错误代码。 您从远程服务器收到的std::string包含2个部分,如您所说,

  

问题是这些是由字符串标识的,例如" 0A01"并且还包含一条消息,错误代码需要一个整数作为值。

由于您还没有共享错误消息的格式,我没有添加用于执行spiting的代码,将您的字符串拆分为两部分,

  1. 错误代码
  2. 错误消息
  3. 现在,您可以使用std::stringint类型的错误代码转换为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.
    

    您可以使用this post中的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.");
    

答案 1 :(得分:0)

不要将error_code子类化。您需要编写自己的错误类别,它将整数映射到您的特定错误。这是如何执行此操作的逐步说明:

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