Поиск по сайту:

Утверждения, ошибки и сбои: в чем разница?


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

Что такое утверждение?

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

if (water_level > high_water_mark) then {
  raise_alert
}

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

if (sensor_readout == nonsensical) then {
  raise_error
  fail
}else{
  if (water_level > high_water_mark) then {
    raise_alert
  }
}

Отлично, теперь мы получим ошибку и завершим процедуру сбоем, если sensor_readout не имеет смысла. И только если значение окажется значимым (из-за предложения else — т. е. что делать в противоположной ситуации), приступайте к сверке water_level с high_water_mark.

Однако, возможно, кто-то отключил питание датчика. Мы можем продолжать в том же духе некоторое время. Мы можем охватить все возможные сценарии, какие только можно вообразить, и все же пропустить некоторые из них. Конечно, мы могли бы охватить каждую возможную ситуацию с помощью соответствующего предложения else и убедиться, что каждое условие сверяется с другим, но даже в таких случаях мы могли пропустить некоторые комбинации переменных.

Даже если бы у нас был только ограниченный набор переменных для работы, количество возможных комбинаций, в которых может оказаться программный пакет, довольно велико. И более того, такого рода условные тесты if довольно регулярно встречаются почти во всех программах.

Размышляя немного об этой дилемме, мы быстро понимаем, что мы (как разработчики) можем (точно так же, как и все люди совершают ошибки) рано или поздно ввести код, который позволит программному обеспечению работать на неопределенной территории. Переменной x присваивается определенное значение, переменной y присваивается другое значение, и в коде этого не было предусмотрено.

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

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

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

Вместо точки кипения (100 градусов по Цельсию) мы проверим более разумный максимум 70 градусов по Цельсию, который все равно никогда не должен быть достигнут, если думать о сборе дождевой воды, по крайней мере, на наш взгляд. Помните слово «мнение», так как оно становится важным, когда речь идет о сообразительности разработчика, реализующего утверждение. (Подробнее об этом ниже.)

if (sensor_readout == nonsensical) then {
  raise_error
  fail
}else{
  assert (water_temp < 70.0){ 
    raise_assert_message 
    fail 
    exit 
  } 
  if (water_level > high_water_mark) then {
    raise_alert
  }
}

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

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

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

Сообщения Assert часто являются ошибками, хотя они могут быть просто ошибками в рассуждениях разработчика. В конце концов, кто сказал, что через 1000 лет температура дождя не будет выше 70 градусов по Цельсию? (Хотя, будем надеяться, что нет!)

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

Assert: (water_temp < 70): (88 < 70): false

Хотя это выглядит немного загадочно (как и некоторые сообщения об утверждениях), присмотревшись повнимательнее, мы понимаем, что во второй части water_temp был заменен на 88 и что на выходе false (т. е. утверждение water_temp < 70 не удалось, так как температура воды была 88 градусов, и, таким образом, утверждение инициировало сообщение об утверждении). Да, это может немного запутать.

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

Что такое ошибка?

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

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

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

Ошибки совершенно обособлены и отличаются от утвержденных сообщений, даже несмотря на то, что утвердительное сообщение само по себе может рассматриваться как ошибка или, скорее, как неопределенная ситуация, которая теперь охватывается утверждением. В общем, компьютерная ошибка обычно переводится как «Мне нужен человек, чтобы это исправить».

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

Что такое сбой?

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

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

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

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

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

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

Подведение итогов

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