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