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

Исключение против Assert?

Возможный дубликат:
дизайн по контрактным испытаниям с помощью утверждения или исключения?

Есть ли правило для принятия решения об использовании исключений вместо утверждений (или наоборот). Сейчас я просто бросаю, если что-то, что я думаю, произойдет во время выполнения на стороне пользователя (например, сокет или ошибка файла). Почти все, что я использую, утверждает.

Кроме того, если я должен был отбросить утверждение, то какой хороший стандартный объект бросить? IIRC есть std:: logic_error, но это не хороший объект для броска? что бы я выбрал для отсутствующего файла или неожиданного ввода (например, из командной строки вместо внешнего приложения)?

4b9b3361

Ответ 1

Мое правило:

Исключения используются для условий ошибки во время выполнения (ошибки ввода-вывода, нехватка памяти, невозможно получить соединение с базой данных и т.д.).

Утверждения используются для ошибок кодирования (этот метод не принимает значения NULL, и разработчик все равно прошел).

Для библиотек с общедоступными классами исключаем исключения из общедоступных методов (потому что имеет смысл это сделать). Утверждения используются, чтобы поймать ВАШИ ошибки, а не их.

EDIT: Это может быть не совсем понятно из-за примера с нулевым значением. Я хочу сказать, что вы используете утверждения (как указывали другие) для условий, которые НИКОГДА не бывают, для условий, которые НИКОГДА не должны превращаться в производственный код. Эти условия абсолютно должны терпеть неудачу во время модульного тестирования или тестирования QA.

Ответ 2

Утвердить материал, который, как вы знаете, не может произойти (т.е. если это произойдет, это ваша ошибка за некомпетентность).

Поднять исключительные ситуации, которые не обрабатываются регулярным потоком управления программой.

Ответ 3

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

Вы используете assert для attertain, чтобы выполнить предварительное условие cetain. Например, указатель не является NULL, или целое число находится в пределах определенного диапазона.

Ответ 4

Как правило, я исключаю исключения из:

  • публичные функции пакета для обнаружения ошибок программирования.
  • внутренние функции для отчета о системных ошибках или сквозных ошибках подсистемы.

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

Ответ 5

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

Я использую исключения для всего остального.

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

Ответ 6

Assert - это средство для проверки того, что программа находится в возможном состоянии. Если функция возвращает -1, когда она должна возвращать только положительные целые числа, и у вас есть утверждение, которое проверяет, что ваша программа должна остановиться, потому что она помещает вашу программу в опасное состояние.