воскресенье, 9 января 2011 г.

26/97: Не игнорируй эту ошибку!

Это перевод Don't Ignore that Error! Автор: Pete Goodliffe.

Из "97-ми вещей, которые должен знать каждый программист".

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

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

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


Слишком много программистов пишет столь же неосмотрительно, как вел себя я той ночью.

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

Мы оповещаем об ошибках во время выполнения различными способами:
  • Код возврата. Он может применяться для оповещения о том, что «что-то пошло не так». Код возврата слишком просто проигнорировать. И вы ничего не заметите вообще. Более того, игнорирование кодов возврата некоторых стандартных функций стало уже традицией. Как часто вы проверяете возвращаемое значение GetMem?
  • Исключения. Более структурированная языковая конструкция для сообщения об ошибках. К тому же, вы не можете их игнорировать. Или все же можете? Как насчет вот такого кода?
    try 
      // ...что-то делаем...
    except
      // игнорировать всё
    end;
    Единственное оправдание этой ужасной конструкции – это то, что она явно показывает то, что вы делаете очень нехорошую вещь.
Если вы игнорируете ошибку в надежде, что ничего не случится, вы сильно рискуете. Как моя нога, пострадавшая гораздо сильнее, чем могла бы, если бы я тогда вовремя остановился. Если вы двигаетесь вперед без оглядки, вы можете столкнуться с очень серьезными проблемами. Решайте проблемы как можно раньше после их возникновения!

Игнорирование ошибок приводит к:
  • Ненадежному коду. Коду, наполненному неуловимыми и сложноисправляемыми ошибками.
  • Небезопасному коду. Хакеры часто используют игнорирование кодов ошибок, и очень часто делают это весьма успешно, «ломая» системы.
  • Плохо структурированному коду. Если аккуратная обработка ошибок слишком скучна, скорее всего, это результат плохо продуманного интерфейса. Переделайте его так, чтобы обрабатывать ошибки было не так обременительно.
Кроме проверки всех потенциальных ошибок, нужно еще делать видимыми все потенциально возможные ошибочные состояния ваших интерфейсов. Не скрывайте их, расчитывая на то, что это будет работать.

Почему мы не проверяем ошибки? Есть несколько общепринятых отговорок. С какими из них вы согласитесь?
  • Обработка ошибок загромождает код, делая его нечитаемым и не позволяя легко отследить основной поток выполнения.
  • Обработка ошибок требует дополнительных усилий, а у меня дедлайн надвигается.
  • Я уверен, что эта функция никогда не вернет ошибку (WriteLn работает всегда, GetMem всегда выделит запрашиваемый объем памяти, а если нет – мы все равно ничего не сможем сделать, ведь это значит, что не работает вся система)
  • Это несерьезная программа, нет смысла ее писать с промышленным качеством.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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