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