Стандарты программирования на С++. 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. Главный недостаток использования исключений для сообщения о программных ошибках состоит в том, что при этом не требуется свертка стека — желательно вызвать отладчик именно в той строке, где обнаружено нарушение, с полным сохранением состояния программы.