Я пытаюсь использовать средство 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по-другому?