Подтвердить что ты не робот

Эквивалент IllegalArgumentException Java в С++

В Java, если входной аргумент метода недействителен, мы можем выбросить IllegalArgumentException (который имеет тип RuntimeException). В С++ нет понятия проверенных и непроверенных исключений. Есть ли аналогичное исключение в стандартном С++, которое может использоваться для указания исключения во время выполнения? Или существует общий стиль не в стандарте, но каждый придерживается практики для такой ситуации?

Или, должен ли я просто создать собственное собственное исключение и выбросить его?

4b9b3361

Ответ 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

Вы можете бросить стандартное исключение или свернуть свое собственное. Возможно, вы захотите включить дополнительную информацию в исключение, которое вы бросаете, и это было бы хорошей причиной для вашего собственного.

Лично я не видел такую ​​проверку домена в системах, над которыми я работал. Это, конечно, не универсально.