Я написал C ++ File Library, в которой есть коды исключений и ошибок. Исключения могут быть отключены во время работы программы. В этом случае пользователь должен проверить коды ошибок. Конечно, когда выброшено исключение, код ошибки не будет возвращен, потому что исключение выдается до возврата вызванной функции. В настоящее время исключения все еще могут быть выброшены при отключении (ошибка). Я исправлю это в ближайшее время. Кто-то сказал мне, что считается плохим дизайном иметь коды исключений и ошибок. Я согласен с ним, и я собираюсь удалить коды ошибок и сделать так, чтобы библиотека генерировала пользовательские исключения с дополнительной информацией об ошибках. Но я стесняюсь. Мне нравится иметь этот гибридный подход по соображениям производительности. Это то, что я думаю сделать: сохранение исключений и кодов ошибок, но исключение исключается через макрос во время компиляции, а не во время выполнения.
Если пользователь определит следующее в общем конфигурационном файле
#define ELMAX_EXCEPTION 1
Следующий код
int Write(std::wstring str) ELMAX_THROW_OR_NOT;
будет расширяться до любого из 2.
// under C++11 compiler
int Write(std::wstring str) noexcept;
// under C++98 compiler
int Write(std::wstring str) throw();
Если ELMAX_EXCEPTION
не определен или равен нулю, макрос будет расширяться до нуля.
int Write(std::wstring) ;
Причина, по которой я хочу это сделать, заключается в том, что для пользователя библиотеки, который хочет выиграть в производительности, не имея компилятора, генерирующего код раскрутки стека (для исключения), и компилятор может лучше оптимизировать такие функции. Моя библиотека файлов C ++ использует API файлов C, и единственное, что может вызвать исключение, это новое ключевое слово, которое я намереваюсь добавить nothrow
, Код UTF-8 также может выдавать исключения (также необходимо изменить)
char *parr = new (nothrow) char[num];
if(parr==NULL)
// handle it either through error code or throw exception (if enabled)
Пожалуйста, посоветуйте мне, если у меня должен быть чистый подход исключения или гибридный подход (как упомянуто), для моих ошибок библиотеки. Спасибо.
Это зависит от того, что вы хотите сделать с библиотекой. Очевидно, что исключения лучше с точки зрения дизайна, но это правда, что они часто отключаются для некоторых видов приложений (таких как иммерсивные 3D-игры).
Других решений пока нет …