【问题标题】:Implementing a good C++0x error_condition?实现一个好的 C++0x error_condition?
【发布时间】:2011-08-22 00:00:50
【问题描述】:

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

所以,我用正确的int+error_categoryerror_code 及其error_category()-方法抛出一个system_error-异常。

但是用error_condition提供便携接口的方法是什么?

error_codeerror_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-Instances 应该是预先创建的,例如(user-code):

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

我的问题是:

  • 我应该在error_category 中实现default_error_condition,以及如何实现?
  • 或者我如何将error_codes 连接到正确的error_conditions
  • 我应该预先构造error_condition 实例吗?
  • 一个类error_code不应该由用户(我)提供,对吧?

有没有一个很好的例子可以让我看看error_condition 应该如何被用户扩展,连同system_error-exceptions?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果我的多平台应用程序有一组错误条件,应该如何抛出?从文档来看,将它们放在system_error 中似乎很奇怪,因为它带有依赖于平台的error_code。例如,我有一个指定为is_error_condition_enumenum,并且我有一个与这些错误条件匹配的error_category。在这种情况下,我是否需要创建一个带有 error_condition 的异常?
    • 您可以创建一个新的异常类型:例如,参见 std::future_error,它特定于期货 API。
    • 谢谢。这是一个很好的参考。还要感谢您在 this::threadboost::threadstd::thread 上所做的所有工作。他们是纯粹的胜利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2011-06-19
    • 2011-12-30
    • 1970-01-01
    • 2011-04-13
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多