Если, как утверждают, не удается, есть ли ошибка?

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

  • Утверждение недействительно (ошибка)
  • Существует ошибка программирования (ошибка)
  • (никаких других опций)

т.е. Есть ли еще какие-нибудь выводы? Существуют ли случаи, когда утверждение будет терпеть неудачу, и нет ошибки?

Ответ 1

Да, в коде есть ошибка.

Код завершен

Утверждения проверяют условия, при которых никогда не должно происходить. [...]

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

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

Ответ 2

Если утверждение не выполняется, появляется ошибка в вызывающем или вызываемом. Почему еще было бы утверждение?

Ответ 3

Это хороший вопрос.

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

Ответ 4

Только если утверждение должно было показать условие предупреждения - в этом случае должен был использоваться специальный класс assert.

Итак, любое утверждение должно показывать ошибку, как вы предлагаете.

Ответ 5

Если вы используете утверждения, вы следите за философия Bertrand Meyer Design by Contract. Это ошибка программирования - контракт (утверждение), который вы указали, не сопровождается клиентом (вызывающим).

Ответ 6

Если вы пытаетесь логически включать все возможности, помните, что, как известно, электронная схема подвергается воздействию излучения из космоса. Если правый фотон/частица попадает в нужное место только в нужное время, это может привести к физически невозможному переходу состояния.

Вероятность исчезающе мала, но все равно отлична от нуля.

Ответ 7

Я могу вспомнить один случай, который бы не считался ошибкой:

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

Пример реального мира (хотя и до эпохи утверждений): если определенная директория была скрыта на определенной машине, программа будет barf. Я никогда не обнаружил какой-либо фрагмент кода, который должен был заботиться, если каталог был скрыт. У меня был только очень ограниченный доступ к оскорбительной машине (на ней была куча бухгалтерского материала), поэтому я не мог правильно ее выследить на машине, и я не мог воспроизвести ее в другом месте. Что-то, что было сделано с этой машиной (преступник никогда не идентифицировался), иногда превращало этот каталог в скрытое.

Я, наконец, прибег к сдаче теста в стартапе, чтобы увидеть, была ли скрыта директория и была ли остановлена ​​ошибка, если бы это было.

Ответ 8

Нет. Ошибка утверждения означает, что что-то случилось, что исходный программист не намеревался или не ожидал.

Это может указывать:

  • Ошибка в коде (вы просто неправильно вызываете метод)

  • Ошибка в утверждении (первоначальный программист был слишком ревностным и жалуется на то, что вы делаете что-то вполне разумное, и метод будет работать отлично.

  • Ошибка в вызываемом коде (ошибка дизайна). То есть, вызываемый код предоставляет контракт, который не позволяет делать то, что вам нужно делать. Утверждение предупреждает вас о том, что вы не можете так поступать, но решение заключается в расширении вызываемого метода для обработки вашего ввода.

  • Известная, но не реализованная функция. Представьте, что я реализую метод, который может обрабатывать положительные и отрицательные целые числа, но мне нужно только (для этого) обрабатывать положительные. Я знаю, что "идеальная" реализация будет обрабатывать и то, и другое, но до тех пор, пока я на самом деле не нуждаюсь в ней для обработки негативов, это пустая трата усилий на реализацию поддержки (и это добавит раздувание кода и, возможно, замедлит мое приложение). Поэтому я рассмотрел это дело, но я решил не применять его до тех пор, пока не будет доказана необходимость. Поэтому я добавляю утверждение, чтобы отметить этот невыполненный код. Когда я позже запускаю assert, передавая отрицательное значение, я знаю, что теперь необходимы дополнительные функции, поэтому я должен увеличить реализацию. Откладывание написания кода до тех пор, пока оно на самом деле не требуется, тем самым экономит мне много времени (в большинстве случаев я никогда не реализую функцию добавления), но assert уверен, что я не получаю ошибок при попытке использовать нереализованную функцию.