Стандарты программирования на С++. 101 правило и рекомендация | страница 124
. Большинство компиляторов вставят строку в вывод сообщения об ошибке. Подумайте также о добавлении >&&"информационное сообщение"
к более сложным проверкам вместо комментария.
Рассмотрим определение вашего собственного >assert
. Стандартный макрос >assert
просто бесцеремонно завершает вашу программу с выводом сообщения в стандартный поток вывода. Ваша среда, вероятно, обладает расширенными возможностями отладки; пусть, например, она в состоянии автоматически запустить интерактивный отладчик. В этом случае вы можете определить собственный макрос >MYASSERT
и использовать его. Может также оказаться полезным оставить большинство проверок даже в окончательной версии программы (лучше не отключать проверки по соображениям эффективности, пока необходимость этого
отключения не будет точно доказана; см. рекомендацию 8), так что существенные преимущества может предоставить наличие различных "уровней проверки", некоторые из которых могут оставаться активными и в окончательной версии программы.
Проверки зачастую связаны с условиями, которые можно было бы протестировать во время компиляции, если бы язык был достаточно выразителен для этого. Например, ваш проект может полагаться на то, что каждый объект класса >Employee
имеет ненулевой идентификатор >id_
. В идеале компилятор мог бы анализировать конструктор >Employee
и его члены и доказать при помощи статического анализа, что указанное условие всегда выполняется. В реальной ситуации вы можете использовать >assert(id_!=0)
в реализации >Employee
:
>unsigned int Employee::GetID() {
> assert(id_!=0 && "Employee ID должен быть ненулевым");
> return id_;
>}
He используйте >assert
для сообщения об ошибках времени выполнения (см. рекомендации 70 и 72). Например, не следует применять >assert
, чтобы убедиться в корректной работе >malloc
, успешном создании окна или запуске потока программы. Однако можно использовать >assert
, чтобы убедиться, что API работает так, как документировано. Например, если вы вызываете некоторую функцию API, в документации на которую сказано, что она всегда возвращает положительное значение, но вы подозреваете наличие в ней ошибки — после вызова этой функции можно воспользоваться >assert
для проверки выполнения постусловия.
Не рекомендуется вместо проверок генерировать исключения, несмотря на то, что именно для этой цели был разработан стандартный класс >std::logic_error
. Главный недостаток использования исключений для сообщения о программных ошибках состоит в том, что при этом не требуется свертка стека — желательно вызвать отладчик именно в той строке, где обнаружено нарушение, с полным сохранением состояния программы.