Там обсуждение продолжается на comp.lang.С++.moderated о том, утверждаются ли утверждения, которые в С++ существуют только в отладочных сборках по умолчанию, должны храниться в производственном коде или нет.
Очевидно, что каждый проект уникален, поэтому мой вопрос здесь не настолько , что должны поддерживаться утверждения, , но в каких случаях это рекомендуется/не рекомендуется.
По утверждению, я имею в виду:
- Проверка времени выполнения, которая проверяет условие, которое, когда ложно, обнаруживает ошибку в программном обеспечении.
- Механизм, с помощью которого программа останавливается (возможно, после минимальной работы по очистке).
Я не обязательно говорю о C или С++.
Мое собственное мнение состоит в том, что если вы программист, но не владеете данными (что имеет место с большинством коммерческих приложений для настольных систем), вы должны их держать, потому что неудачная проверка показывает ошибку, а вы не следует продолжать с ошибкой, рискуя повредить данные пользователя. Это заставляет вас тщательно тестировать перед отправкой и делает ошибки более заметными, поэтому их легче обнаружить и исправить.
Какое ваше мнение/опыт?
Приветствия,
Карл
См. соответствующий вопрос здесь
Ответы и обновления
Эй Грэм,
Утверждение - это ошибка, чистая и простая и поэтому должна обрабатываться как одна. Поскольку ошибка должна быть обработана в режиме освобождения, тогда вам действительно не нужны утверждения.
Вот почему я предпочитаю слово "ошибка", когда говорю об утверждениях. Это делает вещи намного яснее. Для меня слово "ошибка" слишком расплывчато. Отсутствующий файл является ошибкой, а не ошибкой, и программа должна справиться с этим. Попытка разыменовать нулевой указатель - ошибка, и программа должна признать, что что-то пахнет плохим сыром.
Следовательно, вы должны проверить указатель с утверждением, но наличие файла с нормальным кодом обработки ошибок.
Немного не по теме, но важный момент в обсуждении.
Как хэдз-ап, если ваши утверждения врываются в отладчик, когда они терпят неудачу, почему бы и нет. Но существует множество причин, по которым файл не может существовать, который полностью находится вне контроля вашего кода: права на чтение/запись, полный диск, USB-устройство отключено и т.д. Поскольку у вас нет контроля над ним, я чувствую, что утверждения не правильный способ справиться с этим.
Карл
Томас,
Да, у меня есть Code Complete и должен сказать, что я категорически не согласен с этим конкретным советом.
Скажите, что ваш пользовательский распределитель памяти закручивается и обнуляет блок памяти, который все еще используется каким-либо другим объектом. Я случайно обнуляю указатель на то, что этот объект разыскивается регулярно, и один из инвариантов состоит в том, что этот указатель никогда не является нулевым, и у вас есть несколько утверждений, чтобы убедиться, что он остается таким. Что вы будете делать, если указатель внезапно станет нулевым. Вы просто, если() вокруг него, надеясь, что он работает?
Помните, что здесь мы говорим о коде продукта, поэтому там нет взлома в отладчике и проверки локального состояния. Это настоящая ошибка на пользовательской машине.
Карл