Исключение против Assert?
Возможный дубликат:
дизайн по контрактным испытаниям с помощью утверждения или исключения?
Есть ли правило для принятия решения об использовании исключений вместо утверждений (или наоборот). Сейчас я просто бросаю, если что-то, что я думаю, произойдет во время выполнения на стороне пользователя (например, сокет или ошибка файла). Почти все, что я использую, утверждает.
Кроме того, если я должен был отбросить утверждение, то какой хороший стандартный объект бросить? IIRC есть std:: logic_error, но это не хороший объект для броска? что бы я выбрал для отсутствующего файла или неожиданного ввода (например, из командной строки вместо внешнего приложения)?
Ответы
Ответ 1
Мое правило:
Исключения используются для условий ошибки во время выполнения (ошибки ввода-вывода, нехватка памяти, невозможно получить соединение с базой данных и т.д.).
Утверждения используются для ошибок кодирования (этот метод не принимает значения NULL, и разработчик все равно прошел).
Для библиотек с общедоступными классами исключаем исключения из общедоступных методов (потому что имеет смысл это сделать). Утверждения используются, чтобы поймать ВАШИ ошибки, а не их.
EDIT: Это может быть не совсем понятно из-за примера с нулевым значением. Я хочу сказать, что вы используете утверждения (как указывали другие) для условий, которые НИКОГДА не бывают, для условий, которые НИКОГДА не должны превращаться в производственный код. Эти условия абсолютно должны терпеть неудачу во время модульного тестирования или тестирования QA.
Ответ 2
Утвердить материал, который, как вы знаете, не может произойти (т.е. если это произойдет, это ваша ошибка за некомпетентность).
Поднять исключительные ситуации, которые не обрабатываются регулярным потоком управления программой.
Ответ 3
Вы используете исключения для исключительных ситуаций. Например, ситуация с отсутствием памяти или сбой сети.
Вы используете assert для attertain, чтобы выполнить предварительное условие cetain. Например, указатель не является NULL, или целое число находится в пределах определенного диапазона.
Ответ 4
Как правило, я исключаю исключения из:
- публичные функции пакета для обнаружения ошибок программирования.
- внутренние функции для отчета о системных ошибках или сквозных ошибках подсистемы.
где я использую утверждения только внутри, чтобы уловить ошибки реализации.
Ответ 5
Я использую утверждения для вещей, которые никогда не должны происходить, но все же. Что-то вроде того, что когда это происходит, разработчику нужно пересмотреть неверные предположения.
Я использую исключения для всего остального.
В многоразовом коде я предпочитаю исключение, потому что он дает вызывающему абоненту возможность выбора или не справляется с этой проблемой. Просто попробуйте поймать и обработать утверждение!
Ответ 6
Assert - это средство для проверки того, что программа находится в возможном состоянии. Если функция возвращает -1, когда она должна возвращать только положительные целые числа, и у вас есть утверждение, которое проверяет, что ваша программа должна остановиться, потому что она помещает вашу программу в опасное состояние.