实现一个好的C++ 0x error_condition?

tow*_*owi 12 error-handling boost exception boost-asio c++11

我揣摩如何在新system_error一起error_code,error_category而不是(是为了执行最低便携式错误报告)error_condition应该被使用.

我想通过阅读boost.system我明白我应该如何使用error_codeserror_category.该描述省略了在使用system_error`抛出异常时如何结合使用,但是从我可以猜到的那个类的接口.

class system_error : public runtime_error {
public:
  // [...]
  system_error(error_code ec, const string& what_arg);
  system_error(int ev, const error_category& ecat, const string& what_arg);
  system_error(int ev, const error_category& ecat);
  // [...]
Run Code Online (Sandbox Code Playgroud)

所以,我抛出一个system_error-exception与右int+ error_categoryerror_code与它的error_category()-方法.

但是提供便携式接口的方式是什么error_condition

双方error_code error_category都有方法default_error_condition:

class error_category {
public:
  // [...]
  virtual error_condition default_error_condition(int ev) const noexcept;
  // [...]

class error_code {
public:
  // [...]
  error_condition default_error_condition(int ev) const noexcept;
  // [...]
Run Code Online (Sandbox Code Playgroud)

error_category-instances应预先创建的,例如(用户代码):

struct AppCategory : public error_category { 
  const char *name() const noexcept override {
    return "application"; } 
  string message(int ev) const override {
    switch(ev) {
      case 14: return "error message";
      default: return "???";
    }
  } 
  error_condition default_error_condition(int ev) const noexcept override {
     ... ??? ...
  }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 我应该实现default_error_conditionerror_category,又如何?
  • 或者我如何连接error_codes到正确的error_conditions,
  • 我应该预构建error_condition实例吗?
  • 一个类error_code不应该由用户(我)提供,对吧?

有一个很好的例子,我可以看看代码error_condition应该如何由用户扩展,与system_error-exceptions 一起使用?

Ant*_*ams 5

如果您的错误类别的错误代码可以映射到其中一个std::errc错误代码,那么default_error_condition应该执行该映射,并返回std::error_condition一个类别std::generic_category()和相应std::errc枚举值的值.否则它应返回error_condition引用该类别.