Реализовываете хорошее условие ошибки C ++ 0x? - PullRequest
12 голосов
/ 10 мая 2011

Я пытаюсь понять, как новый system_error вместе с error_code, error_category и, что немаловажно, (предназначенный для реализации portable сообщения об ошибках) 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 справильный 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 должны быть предварительно созданы, например ( код пользователя ):

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 экземпляров?
  • A класс error_code не должен быть предоставлен пользователем (мной), верно?

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

1 Ответ

5 голосов
/ 10 мая 2011

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

...