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

Однако это важное соображение при обработке ошибок. Программа должна корректно вести себя при возникновении ошибок.

В этой статье мы рассмотрим:

  • возможные ответы на ошибки
  • примеры ответов на ошибки в распространенных программах
  • как обрабатывать ошибки в вашей программе
  • как обрабатывать другие ошибки в вашей программе

Давайте углубимся.

Варианты ответа

Существуют разные способы реагирования на ошибки. Ты сможешь:

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

Сбой программы — хороший вариант по умолчанию. В этом есть множество преимуществ.

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

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

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

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

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

Последний вариант — попытаться каким-то образом исправить ошибку. Результат должен быть таким, как будто ошибки никогда не было. Программа должна быть в состоянии продолжить выполнение правильно.

Примеры ответов на ошибки

Вот несколько примеров того, как разные программы могут реагировать на ошибки.

Программа, которая находится на ранней стадии разработки

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

Большинство настольных приложений

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

Для программ, которые являются «просмотрщиками» (например, Windows Photos), данные не теряются.

Для программ, которые изменяют данные (таких как Microsoft Word), как правило, теряется очень мало. Эти программы, как правило, имеют функции автосохранения, чтобы свести к минимуму потерю данных.

Ошибка при добавлении в корзину

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

Как следует обрабатывать эту ошибку?

Для начала вы, вероятно, захотите уведомить пользователя. Было бы очень плохо, если бы пользователь не понял, что в его корзине отсутствует товар. Они могут пройти через кассу и заказать все, дождаться прибытия товара и так и не получить его. (Я имею в виду, я сделал это без каких-либо ошибок, чтобы «добавить в корзину», и я могу сказать вам, что это плохо…)

Чтобы уведомить пользователя, вы можете отобразить ему сообщение. Например, вы можете сказать им:

  • действие не удалось
  • что они должны повторить попытку позже
  • что они должны обновить страницу и повторить попытку

Простая анимация

Учтите, что у вас есть простой веб-сайт с небольшой анимацией, которую вы запускаете с помощью JavaScript.

Для этого веб-сайта, если анимация не запускается, это, вероятно, не имеет большого значения.

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

Видеоигра для одного игрока

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

Важная система в самолете

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

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

Как обрабатывать ошибки

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

При обработке ошибок (или любой ошибки) необходимо учитывать:

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

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

Можно ли исправить ошибку (без сбоев)?

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

Однако некоторые ошибки можно исправить.

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

Приложив некоторые усилия, вы сможете справиться с ними, не перезапуская основную программу. Например, в случае сбоя операции вы можете:

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

Другим примером может быть что-то вроде нехватки памяти. Даже это иногда можно восстановить.

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

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

Итак, резюмируя:

  • некоторые ошибки не подлежат восстановлению
  • некоторые ошибки можно исправить, но у вас не будет обработки ошибок для них
  • некоторые ошибки можно исправить, и у вас будет обработка ошибок для них

Пользовательский опыт

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

Усилия по реализации различных ответов на ошибки

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

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

Резюме обработки ошибок

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

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

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

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

Как обрабатывать другие ошибки

«Другие ошибки» — это вещи, которые не являются ошибками в вашей программе. Они могут включать в себя такие вещи, как:

  • не удается отправить сетевой запрос, потому что сетевое соединение прервано
  • не удалось прочитать файл из файловой системы, потому что файл был удален пользователем вручную несколько миллисекунд назад

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

Еще раз необходимо учитывать:

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

В общем, многие из этих ошибок исправимы, и от них легко избавиться.

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

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

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

Заключительные заметки

Так что это все для этой статьи. Я надеюсь, что вы нашли его полезным.

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

Для дальнейших шагов рекомендую посмотреть другие статьи из серии обработка ошибок.

Хорошо, спасибо и увидимся в следующий раз.

Кредиты

Кредиты изображений:

  • Фото знаков — Фото автора Alexander Schimmek on Unsplash
  • Фото Дженги — Фото автора Michał Parzuchowski on Unsplash
  • Фото человека — Фото автора Sebastian Herrmann on Unsplash
  • Шахматное фото — Фото автора Nothing Ahead от Pexels

Первоначально опубликовано на https://programmingduck.com 26 июля 2021 г.