Ошибка скрытия - Error hiding

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

Ошибки и исключения имеют несколько целей:

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

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

Примеры

Языки с обработкой исключений

В этом C # пример, даже если код внутри пытаться блок выдает исключение, его ловит одеяло ловить пункт. Исключение принято и считается обработанным, и программа продолжается.

пытаться {  бросать новый Исключение();} ловить {  // ничего не делать}

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

&{   ловушка { Продолжить }  бросать  запись-вывод "Я не должен быть здесь"}

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

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

пытаться {} ловить(Исключение бывший) {    бросать новый Исключение(бывший.Сообщение);}

Лучший способ повторно генерировать исключения без потери информации - это выбросить исходное исключение из ловить пункт:

пытаться {} ловить(Исключение бывший) {    бросать;}

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

пытаться {} ловить(Исключение бывший) {    бросать новый Исключение(бывший);}

Другие языки

В Идти, ошибки распространяются путем возврата Ошибка объект вместе с обычным возвращаемым значением функции. Его можно игнорировать, как в этом примере.

ж, _ := "Я не должен быть здесь", ошибки.Новый("")fmt.Распечатать(ж)

В случае C системные вызовы, ошибки обозначаются возвращаемым значением вызова НОЛЬ, а информация об ошибках хранится в глобальном errno Переменная. Этот код гарантирует, что файл действителен до доступа к нему, но если fopen не удалось, ошибка проглочена.

ФАЙЛ *файл = fopen("", "р");если (файл) {  // что-то делаем с файлом}

Причины

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

Временные обработчики исключений

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

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

Предотвращение сбоев

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

Скрытие сложности от пользователей

Диалоговое окно ошибки с бессмысленным сообщением об ошибке в настольном приложении

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

Смотрите также

Рекомендации

  1. ^ «Лучшая практика IBM: перехват и повторный выброс исключений Java». www-01.ibm.com. 2009-06-24. Получено 2019-05-02.