[Статья] Обработка ошибок в Php

Discussion in 'PHP' started by Ch3ck, 9 Jul 2006.

  1. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Статья предназначена для начинающих, так что кто "очень разбирается" могёте не читать...
    Хм, решил написать небольшую статью о ошибках в PHP. Выкладываю статью в этот раздел, так как чаще всего тут задаются вопросы данного типа. Итак... Поехали((це)Гагарин)...
    Ошибки в программирование можно разделить на несколько категорий:
    1)Синтаксические ошибки. Тут само собой понятно, что возникают вследствии неверного синтаксиса программы, и не позволяет транслятору правильно интерпертировать код программы.
    2)Логические ошибки. Самые "говнястые". В большинстве случаев сообщение об ошибке не выводится, но программа делает не то, для чего она предназначена.
    3)Ошибки окружения. Возникают в результате внешних факторов.

    В PHP сделали очень информативное отображение ошибок, чтобы программисту(типа Кодера Алёши) было проще их отлаживать.
    Все ошибки выводятся по шаблону:
    Уровень ошибки: сообщение, имя_файла, строка.
    В зависимости от стерпени сложности ошибки, их можно разделить на 2 вида: Это "parse error" - синтаксические,и некому не нравящиеся "fatal error" - неисправимые ошибки, завершающие выполнение сценария программы. Ну конечно,самые частые это - "warnings" - предупреждения и "notices" - "замечания". При возникновении последних двух ошибок выполнение сценария продолжается, но всё равно следует обращать на них внимание и исправлять по возможности.
    Разумеется, PHP предоставляет средства для регулирования того, информацию о каких ошибках следует выводить браузеру. Это зависит от параметра error_reporting, значение по умолчанию которого задается в конфигурационных файлах, а для каждого отдельного сценария его можно определять при помощи одноименной процедуры, единственный параметр которой - целое число - получается следующим образом. Каждому типу ошибок соответствует некоторые значение. Так, 1 соответствует неисправимым ошибкам, 2 - предупреждениям, 4 - синтаксическим ошибкам, а 8 - уведомлениям. Суммируя коды типов ошибок, информацию о которых следует выводить, получаем параметр этой процедуры. Так, например, чтобы вообще не выводить никаких сообщений, следует написать error_reporting(0), а чтобы показывать неисправимые ошибки и предупреждения, параметр функции следует установить равным 3 (1+2).
    На мой взгляд при отладке какой-либо программы следует установить максимальный уровень сообщений. Так же можно заменить все стандартыные сообщения, на более "приятные" глазу, например:
    PHP:
    if(mysql_connect($dbhost$dbuser$password)) {
    /* тут код работы с БД */
    } else {
    echo 
    "<center><H4>Произошла ошибка. Пожалуйста, повторите попытку позже.</H4></center>\n";
    }
    Так же можно вместо выдачи (или вместе с выдачей) ошибки отправить письмо (icq-msg, sms :)) администратору с указанием на ошибку, время возникновения и урл, при котором она возникла, что поможет ее оперативно устранить.
    Иногда бывает полезно просто подавить сообщение об ошибке при отказе какой-либо функции. Для этого перед ее именем следует поставить оператор @:
    PHP:
    if(@mysql_connect($dbhost$dbuser$password)).
    Можно также создать целый набор собственных страниц с сообщениями об ошибках и при их возникновении переадресовывать пользователя в нужном направлении. Тут можно использовать два способа. Если браузеру еще не переданы заголовки страницы, следует воспользоваться функцией header:
    PHP:
    header("Location:error.html")
    ,
    в противном случае можно прибегнуть к средствам javascript:
    echo "<script>location='error.html'</script>";.
    Ещё удобной функцией в PHP является логирование ошибок.
    Для записи сообщений об ошибках PHP предоставляет удобное средство - функцию error_log. Она принимает 2 обязательных параметра и 2 необязательных. Первый - сообщение об ошибке, которое будет записано в журнале. Второй параметр определяет место, куда будет направлено сообщение - это могут быть логи веб-сервера (код 0), электронная почта (1), удаленный отладчик (2) либо какой-либо внешний файл (3). Третья переменная указывает имя файла, email-адрес либо параметры отладчика, в зависимости от значения второго параметра. Так, например, чтобы передать сообщение узлу host.ru на порт 31337, следует вызвать функцию со следующими параметрами: error_log("Error message", 2, "host.ru:31337").
    Для записи сообщений об ошибках удобно реализовать следующую функцию:
    PHP:
    function logit($msg) {
    $date=date("Y-m-d");
    $time=date("H:i");
    error_log("[$date $time$msg\n"3"log.txt"); }
    При помощи настроек php можно также добиться того, чтобы все сообщения об ошибках направлялись в сокет с удаленным отладчиком. За это по существу отвечают три параметра: debugger.host="узел", debugger.port=порт и debugger.enable=true/false.

    Основная задача - создать программу, которая слушала бы указанный в настройках порт на определенном хосте и записывала все сообщения (либо делала что-то другое). Собственно, если ты немного умеешь программировать, тебе не составит труда написать такую программку под любую платформу (хотя бы на Perl или C++). Чтобы включить в каком-либо сценарии работу с удаленным отладчиком, следует воспользоваться функцией debugger_on("хост"). Каждое сообщение об ошибке, передаваемое отладчику, достаточно информативно для установления ее причины и местоположения.
    Вот почитайте-ка...
    _http://php.rinet.ru/manual/sv/function.error-log.php
    _http://php.rinet.ru/manual/sv/function.error-reporting.php
    _http://php.rinet.ru/manual/sv/function.set-error-handler.php
    Так же не забывайте когда пишете программы которые предназначены для "долгого" выполниния например брутфорс, то не забывайте перед началом сценария воткнуть в код
    PHP:
    set_time_limit(0);.
    И ещё забыл часто бывает что вылетает такая ошибка:
    "Undefined function" и новички в большинстве случаев не могут разобраться в чем дело - так вот, следите за очепятками...тьфу, опечатками.
    И помните... Ошибки в программах допускают даже проффы... :cool:
     
    #1 Ch3ck, 9 Jul 2006
    Last edited: 9 Jul 2006
  2. Dracula4ever

    Dracula4ever Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    418
    Likes Received:
    183
    Reputations:
    26
    Я вижу ты спец в PHP.
    Помоги мне с этим кодом:
     
    #2 Dracula4ever, 9 Jul 2006
    Last edited: 9 Jul 2006
  3. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    а как же strict'ы ? :) или мы на 5ой верси не программируем? :))
     
  4. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    2 r0cha! до пятой не как руки не дойдут... хотя во много удобней 4-ки :)

    2 dracula4ever я не спец. :) и чего имеено еадо? или чего у тебя с этим кодом не получается?!
     
  5. SMiX

    SMiX Elder - Старейшина

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Ты про пинг забыл наверное. На некоторых серверах сначала нуно ответить на пинг понгом, а потом идентифицироваться и т.п.
     
    #5 SMiX, 9 Jul 2006
    Last edited: 9 Jul 2006
    1 person likes this.