Эквивалент IllegalArgumentException Java в С++
В Java, если входной аргумент метода недействителен, мы можем выбросить IllegalArgumentException
(который имеет тип RuntimeException
). В С++ нет понятия проверенных и непроверенных исключений. Есть ли аналогичное исключение в стандартном С++, которое может использоваться для указания исключения во время выполнения? Или существует общий стиль не в стандарте, но каждый придерживается практики для такой ситуации?
Или, должен ли я просто создать собственное собственное исключение и выбросить его?
Ответы
Ответ 1
В отличие от Java, С++ не имеет "стандартной структуры", а только небольшой (и необязательной) стандартной библиотеки. Более того, у программистов на C++ есть разные мнения о том, следует ли вообще использовать исключения.
Поэтому вы найдете разные рекомендации разных людей: некоторым нравится использовать типы исключений из стандартной библиотеки, некоторые библиотеки (например, Poco) используют настраиваемую иерархию исключений (производную от std:: exception), а другие не используют исключения вообще (например, Qt).
Если вы хотите придерживаться стандартной библиотеки, существует специализированный тип исключения: invalid_argument
(extends logic_error
).
#include <stdexcept>
// ...
throw std::invalid_argument("...");
Для справки: Ниже приведен обзор стандартных типов исключений, определенных (и задокументированных) в stdexcept
:
exception
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow_error
underflow_error
Ответ 2
std:: domain_error может быть тем, что вы ищете, но я подозреваю, что очень немногие люди его используют. Большинство людей получают свои собственные типы исключений из std:: exception.
Ответ 3
Я всегда использую std::invalid_argument
для незаконных аргументов.
Ответ 4
Если по неверному вы имеете в виду, что не удовлетворены ожидаемые значения метода, вы можете бросить
std::logic_error
or
std::runtime_error.
Если вы имеете в виду что-то, связанное с кастами, так как один объект не может быть преобразован в другой - для этого нет исключения, и он не будет автоматически отбрасываться.
На самом деле это будет. Но только для ссылок dynamic_cast < > .
Он бросит
std::bad_cast
Я не уверен, что это хорошая идея бросить это по своему усмотрению.
Я предпочитаю использовать logic_error и его производные, если кто-то передал неправильный параметр, потому что это логическая ошибка: программист передал неправильный тип аргумента.
Но больше всего мне нравится использовать assert в таких случаях. Поскольку такие вещи, как передача неправильных значений или типов вашей функции, могут быть приемлемыми только во время разработки, и таких проверок следует избегать в выпуске.
Ответ 5
Вы можете бросить стандартное исключение или свернуть свое собственное. Возможно, вы захотите включить дополнительную информацию в исключение, которое вы бросаете, и это было бы хорошей причиной для вашего собственного.
Лично я не видел такую проверку домена в системах, над которыми я работал. Это, конечно, не универсально.