Я пытаюсь использовать средство system_error
для обработки ошибок в моей библиотеке. Я кратко расскажу о структуре библиотеки, если вы сочтете ее полезной: пространство имен библиотеки называется commons
, и под этим я имею другое пространство имен, которое называется dynlib
. dynlib
содержит классы, которые отвечают за загрузку .so/.dll файлов:Понимание объекта <system_error> в C++ 11
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
для всего пространства имен общего пользования и задавать только разныеstd::error_condition
для каждого пространства под-имен, напримерdynlib
. Это хорошая практика? Я бы сказал, да, потому что это позволит избежать дублирования кода. Но есть ли уловка за этим? - На данный момент я использую один
std::error_category
для каждого пространства под-имен общего пользования. Это хорошая практика? Как вы думаете, я должен использоватьstd::error_category
по-другому?