Найти в Дзене
PHP Боярин

Как правильно ошибаться

Если вы собрались заняться программированием - вы допустили ошибку. Я тоже сейчас ошибся: употребил неверное время. Вы допустите множество ошибок, пока не научитесь эффективной разработке на PHP. И уже став профессионалом, вы не перестанете их допускать. Сначала это будут синтаксические ошибки. В основном, это опечатки. Их вам подсветит редактор. Если все-таки попытаться запустить код с синтаксической ошибкой, интерпретатор тоже сообщит о том, что что-то не так: пропущена точка с запятой, неправильно записано название функции, перепутали местами аргументы или еще что-то. Существуют также ошибки при проектировании. В этом случае все вроде бы идет как надо, но система не выдерживает нагрузок и не дает масштабироваться, или обнаруживается "узкое место", которое хорошо бы убрать, или новые требования к системе заставляют переписывать все с нуля, потому что старая модель не позволяет ничего добавить. Однако, основная масса ошибок - так называемые логические ошибки. Это неправильное описа
Оглавление

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

Я тоже сейчас ошибся: употребил неверное время. Вы допустите множество ошибок, пока не научитесь эффективной разработке на PHP. И уже став профессионалом, вы не перестанете их допускать.

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

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

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

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

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

А прерывается оно, например, потому, что бегемот слишком большой, и не помещается в максимальную длину запроса. Крокодильчики, на которых разработчик тестировал, пролезают. Зебра, которую все хотят записать - пролезает. А бегемот, зараза, слишком большой. С ним хочет работать только Нганга, так что у остальных приложение работает на 100%. Зато у Нганги - на 100% не работает.

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

Неизвестная ошибка

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

  1. Мы не знаем, почему не удалось получить данные
  2. Поэтому мы запишем максимум информации об этом
  3. Если эти данные действительно были нам нужны, скрипт должен постараться завершиться, вместо того, чтобы дальше впустую обрабатывать пустоту

Этот принцип называется "fail fast".

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

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

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

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

Известная ошибка

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

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

Если пользователь вводит в форму поиска "фрзер", можно выдать ему результаты по слову "фрезер", предупредив о возможной ошибке.

А вот отсутствие соединения с базой данных обычно означает, что процесс лучше немедленно завершить.

Известные ошибки мы можем позволить себе обрабатывать по-разному.

Повторяющаяся ошибка

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

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

#программирование #обработка ошибок