Плохая цобако

Писец, сколько людей упёртых не там, где надо. Нахватались поначалу «правильных советов от великих гуру» и теперь остальным мозг выносят. «Никогда не используйте eval», «никогда не используйте @ в PHP»…

Действительно ли никогда нельзя использовать собаку (@) в пыхе? Давайте просто головой подумаем.

Итак, как можно бороться с ошибками в программном коде? Есть два основных способа:

  1. Путём их игнорирования.
  2. Путём их корректной обработки.

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

Нам нужна корретная обработка. Однако, ошибки бывают разные и способы их корректной обработки тоже разные.

Первый тип ошибок: ошибки в программе. Синтаксическая ошибка, в запросе опечатались, лень было проверить существование запрашиваемого ключа в массиве и т.п. Аналог проверяемых исключений (RuntimeException). Корректная обработка подобных ошибок может быть только одна — исправление программного кода на этапе разработки. И для этого нам нужно чётко отлавливать их появление и ни в коем случае не подавлять сообщения о них. Здесь собака действительно вредна.

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

$lid = mysql_connect($host, $user, $password);
if (!$lid) {
    throw new Exception('MySQL fail');
}

Мы не спрятали голову в песок. Мы корректно обработали возможную ошибку. Но вот незадача — несмотря на это, mysql_connect() всё равно выкинет совершенно уже ненужный нам Warning.

К чёрту Warning!

$lid = @mysql_connect($host, $user, $password);
if (!$lid) {
    throw new Exception('MySQL fail');
}

Вывод: слушайте умных дядей, но и своей головой думайте.

21 комментарий »

  • Ага, согласен, сам так же делаю. Хотя я часто и нотайсы глушу вообще, на формы к примеру:

    <input value="" />

    Просто мне влом писать каждый раз:

    <input value="" />

    и т.п.

    >Писец, сколько людей упёртых не там, где надо.
    Это про меня? Как-то такое от тебя уже слышал в свой адрес…

    adw0rd, 4.03.2010, 14:32

  • Поправь мой каммент, а то все теги съело…

    adw0rd, 4.03.2010, 14:32

  • В первом было

    Во втором было

    adw0rd, 4.03.2010, 14:33

  • Все, заебал твой парсер камментов…

    adw0rd, 4.03.2010, 14:34

  • Полная чепуха

    Ewg, 4.03.2010, 14:36

  • >Все, заебал твой парсер камментов…
    В твоём вордпрессе иной? поделись

    >Полная чепуха
    Это да

    vasa_c, 4.03.2010, 15:04

  • >Это про меня? Как-то такое от тебя уже слышал в свой адрес…
    Нет, не про тебя

    vasa_c, 4.03.2010, 15:13

  • 1) ГО, у тебя из RSS’ки ссылки ведут на 404

    2) вот еще вариантец корректной обработки подключения к БД:
    $er = error_reporting(0);
    $id = mysql_connect(/*…*/);
    error_reporting($er);
    if (!$id)
    throw …

    3) на ундефайнед индекс при отправки форм я забиваю. Но: будет у меня класс для обработки параметров $_GET, $_POST — тогда эти нотайсы сами уйдут

    Абырвалг, 4.03.2010, 15:25

  • >В твоём вордпрессе иной? поделись
    хз, мой так себя не ведет… надо смотреть конфиги в админке и сравнивать, приезжай на выходных — сравним :)

    adw0rd, 4.03.2010, 15:29

  • >ГО, у тебя из RSS’ки ссылки ведут на 404
    Хм, спасибо за информацию, но у меня нормально вроде.
    Все ссылки или только эта?

    vasa_c, 4.03.2010, 15:40

  • ссылка на запись — http://feedproxy.google.com/~r/blgo/~3/kszmTccyqEc/ , редиректит на
    http://blgo.ru/blog/2010/03/04/baddo/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+blgo+%28%D0%91%D0%BB%D0%BE%D0%B3+%D0%93%D0%9E%29

    Клиент — мозилла сандберд, последней версии

    Абырвалг, 4.03.2010, 16:39

  • Ясно, это URL сначала в вордпрессе обрезался, а я его изменил. Видимо успел подхватиться первый.
    Раньше при подобном со старого адреса редиректило на новый, а теперь, почему то нет.
    Спасибо

    vasa_c, 4.03.2010, 17:19

  • Слушай, а нахуй вообще этот фидбернер нужен? Я просто еще на одном сайте заметил косяки с ним.

    Абырвалг, 4.03.2010, 21:57

  • Я не знаю. Мне посоветовали те, кто лучше меня в этих вещах разбирается.
    Мне он удобен тем, что ведёт статистику подписчиков.

    vasa_c, 4.03.2010, 22:16

  • * Статистика
    * Проксирование/CDN (снижение нагрузки, если она есть)

    И вообще для кого гугл изобрели? — http://ru.wikipedia.org/wiki/FeedBurner

    adw0rd, 5.03.2010, 9:43

  • ну вообще, для того чтобы все таки не ставить собаку в продакшен окружении делается
    ini_set(‘log_errors’,1);
    ini_set(‘display_errors’,0);
    error_reporting(E_ALL);
    ini_set(‘error_log’,’syslog’);

    и ставится какой нибудь Syslog-NG с веб интерфейсом или Splunk, который срет в БД логами

    а в разработке соответсвенно
    ini_set(‘log_errors’,1);
    ini_set(‘display_errors’,1);
    error_reporting(E_ALL);
    ini_set(‘error_log’,’php5-error.log’);

    как определять DEV и PRODUCTION окружения? ну например по HTTP_HOST_NAME

    согласитесь при РАЗРАБОТКЕ MySQL сервер отваливаться не должен, и варнинг там как раз будет не лишним, а вдруг мы забыли (поленились) корректно обработать ошибку, все же не проконтролируешь?

    Slach, 27.04.2010, 6:36

  • >ну вообще, для того чтобы все таки не ставить собаку в продакшен окружении делается
    ну, скорее это делается в php.ini

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

    >вдруг мы забыли (поленились) корректно обработать ошибку
    но ведь собака ставится не один раз и сразу давит все сообщения, она ставится в конкретном месте, где мы уже конкретно обрабатываем ошибку :)

    vasa_c, 27.04.2010, 10:01

  • Не согласен. На продакшне нужно иметь display_errors = off и тогда этот варнинг, что важно, упадет в лог! И спустя пару дней, копая, его можно там найти.

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

    ЗЫ. Побочный фактор: использование собаки наносит громадный удар по скорости обработки — до 700% падение скорости формирования ответа скрипта.

    Горбунов Олег, 29.04.2010, 14:49

  • ГО, извини, не понял, с чем ты не согласен.
    Закрывать глупо, да — нужно обрабатывать.

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

    vasa_c, 29.04.2010, 17:33

  • Ну как с чем — с приведенным примером )
    Ибо в твоем случае ошибка обработается, только если у тебя кто-то их обрабатывает. В противном случае, исключение сплывет до верху — и сюрприз! сгенерит опять варнинг )

    Поэтому если ты хотел показать, как оно надо — оно не получилось )

    Неокрепшие умы всегда ужасаются, это их свойство ;)

    Просто твоя формулировка «собака и евал не так плохо как говорят другие плохие дяди» ничем не лучше чем когда «другие плохие дяди говорят что евал и собака — это плохо, очень плохо». Напиши как правильно ошибка обрабатывать — тогда тебе будет слава великая, и станешь ты первым среди равных джедаев! ;)

    Горбунов Олег, 30.04.2010, 12:05

  • Согласен со статьей. Надо было еще привести пример с @getimagesize, когда она используется для определения «наличия изображения в файле».

    Олег, тот что Горбунов, хватит переживать так за неокрепшие умы, они всё равно всё копипастят… ;))

    kostyl, 16.09.2010, 14:13

Leave a comment