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

Когда следует использовать assert()?

При разработке большого проекта программирования на С++ со многими разработчиками мы столкнулись с проблемами с ненадлежащим использованием assert() в коде, что приводит к низкому качеству, когда утверждение действительно происходит, и продукт выходит из строя.

Вопрос в том, какие хорошие принципы применимы для использования assert() соответственно? Когда правильно использовать assert(), а когда нет? Есть ли список критериев, которые должны пройти каждое утверждение, чтобы быть законными? Как мы можем поощрять правильное использование assert()?

В качестве первой трещины в этом я бы сказал, что assert() следует использовать только для документирования условия, которое, как считается, невозможно достичь, и которое должно быть идентифицировано как отказ assert() во время выполнения, когда оно когда-либо возникают из-за нарушения программных допущений.

Могут ли люди сделать это лучше? Каков ваш опыт работы с assert()?

4b9b3361

Ответ 1

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

Используйте Утверждения, чтобы указать внутренние дефекты, такие как ошибки программирования, условия, которые не должны возникать, например. инварианты класса/метода и недопустимое состояние программы.

Ответ 2

Вы должны использовать assert для проверки всех условий, которые никогда не должны происходить:

  • Предпосылки для входных параметров
  • Результаты промежуточных вычислений
  • Постусловия состояния объекта

Но вы должны включать эти утверждения только в отладочные сборки или при явной активации для выпуска (не в сборках, выпущенных для клиентов).

Ответ 3

Я использую утверждения для проверки состояния нежелательной программы:

  • Предпосылки функции
  • Иногда я вставляю их в макрос после каждого вызова API: glDrawArray(); checkOpenGLError(); - checkOpenGLError() будет вызывать getGLError(), если включен
  • целостность структуры данных: assert (something == null);
  • Иногда мне нужен GDB (iOS SDK 3.2). Я использую утверждения, чтобы доказать это.

EDIT:

"нежелательное состояние программы" исключает ошибки, которые, естественно, происходят во время выполнения, например, неспособность открыть выбранный пользователем файл из-за разрешений или отказа HD. В этих случаях нецелесообразно использовать утверждения.

Ответ 4

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