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

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

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

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

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

4 ответов


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

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


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

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

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


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

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

изменить:

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


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