Я всегда следил за логикой: если утверждение терпит неудачу, тогда появляется ошибка. Корневая причина может быть:
- Утверждение недействительно (ошибка)
- Существует ошибка программирования (ошибка)
- (никаких других опций)
т.е. Есть ли еще какие-нибудь выводы? Существуют ли случаи, когда утверждение будет терпеть неудачу, и нет ошибки?
Ответ 1
Да, в коде есть ошибка.
Код завершен
Утверждения проверяют условия, при которых никогда не должно происходить. [...]
Если утверждение уволено за аномальное условие, корректирующее действие не просто обрабатывать ошибку изящно - корректирующее действие для изменения исходного кода программы, перекомпилировать и выпустить новую версию программного обеспечения.
Хороший способ думать об утверждениях как исполняемый файл документация - вы не можете полагаться на них чтобы код работал, но они могут документальные предположения более активно чем комментарии на программном языке.
Ответ 2
Если утверждение не выполняется, появляется ошибка в вызывающем или вызываемом. Почему еще было бы утверждение?
Ответ 3
Это хороший вопрос.
Я чувствую, что если утверждение терпит неудачу из-за вашего кода, то это ошибка. Утверждение является ожидаемым поведением/результатом вашего кода, поэтому ошибка утверждения будет ошибкой вашего кода.
Ответ 4
Только если утверждение должно было показать условие предупреждения - в этом случае должен был использоваться специальный класс assert.
Итак, любое утверждение должно показывать ошибку, как вы предлагаете.
Ответ 5
Если вы используете утверждения, вы следите за философия Bertrand Meyer Design by Contract. Это ошибка программирования - контракт (утверждение), который вы указали, не сопровождается клиентом (вызывающим).
Ответ 6
Если вы пытаетесь логически включать все возможности, помните, что, как известно, электронная схема подвергается воздействию излучения из космоса. Если правый фотон/частица попадает в нужное место только в нужное время, это может привести к физически невозможному переходу состояния.
Вероятность исчезающе мала, но все равно отлична от нуля.
Ответ 7
Я могу вспомнить один случай, который бы не считался ошибкой:
Утверждается, что нужно проверить что-то внешнее, которое обычно должно быть там. Вы охотитесь за чем-то ореховым, которое происходит на одной машине, и вы хотите знать, отвечает ли какой-то определенный фактор.
Пример реального мира (хотя и до эпохи утверждений): если определенная директория была скрыта на определенной машине, программа будет barf. Я никогда не обнаружил какой-либо фрагмент кода, который должен был заботиться, если каталог был скрыт. У меня был только очень ограниченный доступ к оскорбительной машине (на ней была куча бухгалтерского материала), поэтому я не мог правильно ее выследить на машине, и я не мог воспроизвести ее в другом месте. Что-то, что было сделано с этой машиной (преступник никогда не идентифицировался), иногда превращало этот каталог в скрытое.
Я, наконец, прибег к сдаче теста в стартапе, чтобы увидеть, была ли скрыта директория и была ли остановлена ошибка, если бы это было.
Ответ 8
Нет. Ошибка утверждения означает, что что-то случилось, что исходный программист не намеревался или не ожидал.
Это может указывать:
-
Ошибка в коде (вы просто неправильно вызываете метод)
-
Ошибка в утверждении (первоначальный программист был слишком ревностным и жалуется на то, что вы делаете что-то вполне разумное, и метод будет работать отлично.
-
Ошибка в вызываемом коде (ошибка дизайна). То есть, вызываемый код предоставляет контракт, который не позволяет делать то, что вам нужно делать. Утверждение предупреждает вас о том, что вы не можете так поступать, но решение заключается в расширении вызываемого метода для обработки вашего ввода.
-
Известная, но не реализованная функция. Представьте, что я реализую метод, который может обрабатывать положительные и отрицательные целые числа, но мне нужно только (для этого) обрабатывать положительные. Я знаю, что "идеальная" реализация будет обрабатывать и то, и другое, но до тех пор, пока я на самом деле не нуждаюсь в ней для обработки негативов, это пустая трата усилий на реализацию поддержки (и это добавит раздувание кода и, возможно, замедлит мое приложение). Поэтому я рассмотрел это дело, но я решил не применять его до тех пор, пока не будет доказана необходимость. Поэтому я добавляю утверждение, чтобы отметить этот невыполненный код. Когда я позже запускаю assert, передавая отрицательное значение, я знаю, что теперь необходимы дополнительные функции, поэтому я должен увеличить реализацию. Откладывание написания кода до тех пор, пока оно на самом деле не требуется, тем самым экономит мне много времени (в большинстве случаев я никогда не реализую функцию добавления), но assert уверен, что я не получаю ошибок при попытке использовать нереализованную функцию.