Я пытаюсь использовать средство system_error
для обработки ошибок в моей библиотеке. Я кратко расскажу о структуре библиотеки, если вы сочтете ее полезной: пространство имен библиотеки называется commons
, и под этим я имею другое пространство имен, называемое dynlib
. dynlib
содержит классы, ответственные за загрузку файлов .so/.dll:
namespace commons {
namespace dynlib {
class DynLibLoader {
};
}
}
Ошибки, которые могут возникнуть в DynLibLoader, это LibraryFailedToLoad
, LibraryFailedToUnload
и SymbolNotFound
. Поэтому мои мысли для обработки ошибок следующие: я добавлю пространство имен error
в пространство имен dynlib
. Затем в этом пространстве имен я определяю одно перечисление для std::error_codes
и одно перечисление для std::error_conditions
. По моему мнению, std::error_codes
должны соответствовать значению errno
(Linux) или GetLastError
(Win32), а std::error_conditions
- значениям LibraryFailedToLoad
, SymbolNotFound
и т.д. Итак, вот мои вопросы:
- Правильно ли я понимаю, что
std::error_code
иstd::error_condition
? - Как я должен знать все возможные значения
errno
иGetLastError()
, чтобы определить их под моим перечислениемstd::error_codes
? Что делать, если Microsoft добавит дополнительные значения ошибок в API в будущем? Должен ли я вернуться к исходному коду и определить их под перечислением, которое у меня есть дляstd::error_codes
? - Что делать, если мы находимся на другой платформе, и нет способа определить точный системный код ошибки при возникновении ошибки?
- Что делать, если я хочу иметь один и тот же
std::error_codes
для всего пространства имен commons и определять толькоstd::error_condition
для каждого пространства под-имен, напримерdynlib
. Это хорошая практика? Я бы сказал, да, потому что это позволит избежать дублирования кода. Но есть ли уловка за этим? - В настоящий момент я использую единственный
std::error_category
для каждого пространства под-имен общих прав. Это хорошая практика? Как вы думаете, я должен использоватьstd::error_category
по-другому?