При разработке моей первой «серьезной» библиотеки C ++ я спрашиваю себя:
Это хороший стиль, чтобы извлечь свои исключения, std::exception
и это потомки ?!
Даже после прочтения
Я все еще не уверен. Потому что, помимо обычной (но, возможно, не очень) практики, я бы предположил, как пользователь библиотеки, что библиотечная функция будет генерировать std::exception
s только в случае сбоя стандартных библиотечных функций в реализации библиотеки, и она ничего не может с этим поделать. Но тем не менее, при написании кода приложения, для меня это очень удобно, а также ИМХО хорошо выглядеть просто бросить std::runtime_error
. Также мои пользователи также могут рассчитывать на определенный минимальный интерфейс, например what()
или коды.
И, например, мой пользователь предоставляет неверные аргументы, что было бы удобнее, чем бросать std::invalid_argument
, не так ли? Таким образом, в сочетании с все еще распространенным использованием std :: exception, я вижу в коде других: почему бы не пойти еще дальше и извлечь из своего пользовательского класса исключений (например, lib_foo_exception), а также из std::exception
.
Мысли?
lib_foo_exception
класс наследует от std::exception
пользователя, пользователь библиотеки будет ловить lib_foo_exception
, просто ловя std::exception
, в дополнение к тому, когда он ловит только библиотечный. Поэтому я мог бы также спросить, должен ли мой корневой класс исключения библиотеки наследоваться от std :: exception .
lib_foo_exception
?» С наследованием от std::exception
вас это можно сделать catch(std::exception)
ИЛИ путем catch(lib_foo_exception)
. Не получая от этого std::exception
, вы бы поймали его тогда и только тогда , когда catch(lib_foo_exception)
.
catch(...)
. Это происходит потому, что язык учитывает тот случай, который вы рассматриваете (и «недостойное поведение» библиотек), но это не лучшая современная практика.
catch
сайты, а также более грубые транзакции, которые моделируют пользовательскую операцию. Если вы сравните его с языками, которые не продвигают идею обобщенного перехвата std::exception&
, например, они часто имеют гораздо больше кода с промежуточными try/catch
блоками, связанными с очень специфическими ошибками, что несколько уменьшает общность обработки исключений, поскольку она начинает появляться гораздо больший упор на ручную обработку ошибок, а также на все несопоставимые ошибки, которые могут произойти.
std::exception
не означает , что вы броситьstd::exception
. Кроме того,std::runtime_error
наследуется лиstd::exception
в первую очередь отwhat()
методаstd::exception
, а не отstd::runtime_error
. И вам определенно следует создавать свои собственные классы исключений, а не генерировать общие исключения, такие какstd::runtime_error
.