Подтвердить что ты не робот

Внедрение хорошего С++ 0x error_condition?

Я пытаюсь понять, как следует использовать новый system_error вместе с error_code, error_category и не в последнюю очередь (для реализации переносимой отчетности об ошибках) error_condition.

Я думаю, прочитав boost.system Я понимаю, как я должен использовать error_codes и error_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 -exception с помощью правильного int + error_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 -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 {
     ... ??? ...
  }
};

Мои вопросы:

  • Должен ли я реализовать default_error_condition в error_category и как?
  • Или как подключить error_codes к правильному error_conditions,
  • и должен ли я предварительно конструировать экземпляры error_condition?
  • Класс error_code не должен предоставляться пользователем (мной), правильно?

Есть ли хороший пример, где я могу взглянуть на код, как error_condition должен быть расширен пользователем в сочетании с system_error -exceptions?

4b9b3361

Ответ 1

Если коды ошибок для категории ошибок могут быть сопоставлены с одним из кодов ошибок std::errc, тогда default_error_condition должно выполнить это сопоставление и вернуть a std::error_condition с категорией std::generic_category() и значением соответствующее значение std::errc enum. В противном случае он должен вернуть error_condition, ссылаясь на эту категорию.