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

时间:2011-05-09 21:08:30

标签: exception boost error-handling boost-asio c++11

我尝试弄清楚新的system_errorerror_codeerror_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);
  // [...]

所以,我向system_error + interror_category及其error_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;
  // [...]

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

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 {
     ... ??? ...
  }
};

我的问题是:

  • 我应该在default_error_condition中实施error_category,以及如何实施?
  • 或如何将error_codes与正确的error_conditions
  • 相关联
  • 我应该预先构建error_condition个实例吗?
  • 用户(我)不应提供课程error_code,对吧?

是否有一个很好的示例,我可以看一下代码{/ 1}}应该由用户扩展的哪些内容,以及error_condition - 例外?< / p>

1 个答案:

答案 0 :(得分:5)

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