Эквивалент IllegalArgumentException для Java в C ++ - PullRequest
24 голосов
/ 25 марта 2009

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

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

Ответы [ 5 ]

44 голосов
/ 25 марта 2009

В отличие от 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 голосов
/ 25 марта 2009

Я всегда использую std::invalid_argument для недопустимых аргументов.

2 голосов
/ 25 марта 2009

std :: domain_error может быть тем, что вы ищете, но я подозреваю, что очень немногие используют его. Большинство людей получают свои собственные типы исключений из std :: exception.

1 голос
/ 25 марта 2009

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

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

1 голос
/ 25 марта 2009

Если под недействительным вы подразумеваете, что метод не удовлетворяет ожидаемым значениям, вы можете выбросить

std::logic_error 
or 
std::runtime_error.

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

На самом деле это будет. Но только для dynamic_cast <> по ссылкам. Это бросит

std::bad_cast

Я не уверен, что это хорошая идея - бросить это самостоятельно.

Я предпочитаю использовать logic_error и его производные, если кто-то передал неправильный параметр, потому что это логическая ошибка: программист передал неверный тип аргумента.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...