Я пытаюсь понять, как новый 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
-исключениями?