Четверг, 16.05.2024, 11:46
DigitalBox
Приветствую Вас Гость | RSS
Главная Обработка ошибок Регистрация Вход
Меню сайта

Обработка ошибок


При возникновении проблем с выполнением сценария интерпретатор РНР выдает сообщения об ошибках. Существуют следующие типы сообщений:

  • Сообщение об ошибке (error message). Это сообщение выдается при возникновении проблем, препятствующих выполнению сценария. Сценарий отображает сообщение об ошибке и прекращает свою работу. Чтобы помочь идентифицировать проблему, такое сообщение должно содержать как можно больше информации. Вот пример типичного сообщения об ошибке:
    Parse error: parse error in c:\test.php on line 6
    Такие сообщения об ошибках часто выдаются при отсутствии символа-разделителя (точки с запятой, кавычек или скобок).
  • Предупреждение (warning message). Предупреждающее сообщение выдается в том случае, когда интерпретатор РНР встречает проблему, но эта проблема не препятствует выполнению сценария. Предупреждающие сообщения указывают на вероятную некорректность кода. Необходимо идентифицировать источник возникновения сообщения, а затем решить, нужно ли изменять сценарий. Например, если не указать имя переменной в качестве параметра функции print_r — написать print_r(), а не print_r($varname), —появится следующее сообщение:
    Warning: print_r () expects at least 1 parameter, 0 given in d:\test1.php on line 9
    Поскольку это предупреждение, а не сообщение об ошибке, то после выполнения функции print_r работа сценария продолжится. Предупреждение обычно указывает на более серьезную проблему, а не содержит простое уведомление.В этом случае необходимо устранить проблему.
  • Уведомление (notice). Такое сообщение выводится в том случае, когда в сценарии РНР встречается конструкция, которая может быть и ошибочной, и правильной. Обычно уведомление выводится в ответ на попытку отображения на экране несуществующих переменных. Рассмотрим пример:
    Notice: Undefined variable:age in testing.php on line 9

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

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


Изменение уровня проверки ошибок для Web-узла

Уровень проверки ошибок для Web-узла определяется в файле php.ini. Если вы являетесь администратором модуля РНР и имеете доступ к файлу php.ini, то сможете изменить уровень проверки ошибок. Если вы не являетесь администратором, то можете изменить уровень обработки ошибок для каждого сценария в отдельности.

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

error_reporting = E_ALL; displayallerrors, warnings and notices (выводить все ошибки, уведомления и предупреждения)

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

Обратите внимание на то, что в приведенном выше примере точка с запятой находится после значения E_ALL, а не в начале строки. Точка с запятой — это символ, обозначающий комментарий в файле php.ini. Поэтому текст в строке после точки с запятой— только комментарий, а не часть команды. Если бы точка с запятой располагалась в начале строки, то комментарием считалась бы вся строка и данная команда не выполняла бы никаких действий.

При внимательном изучении файла php.ini вы, вероятно, найдете несколько закомментированных команд. Эти инструкции включены как примеры, а не как выполняемые команды. Инструкции файла php.ini без точки с запятой в начале строки являются действующими.

E_ALL— это встроенная константа РНР, которая определяет все ошибки, предупреждения и уведомления; E_NOTICE — встроенная константа, определяющая уведомления. Эти две константы можно использовать в следующей конструкции:

error_reporting = E_ALL & ~E_NOTICE

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

Две инструкции, приведенные в этом разделе, используются наиболее часто. Чтобы установить уровень обработки ошибок, можно использовать и другие константы. Однако констант E_ALL и E_NOTICE обычно достаточно для большинства сценариев. Список всех констант можно найти в конфигурационном файле php.ini. Для получения более детальной информации об установке уровня обработки ошибок прочтите интерактивное руководство по языку РНP.

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

Чтобы отключить вывод сообщений об ошибках, найдите в файле php.ini строку display_errors = On и измените значение параметра On на Of f.

Для того чтобы внесенные изменения вступили в силу, после любой модифккации файла php.ini необходимо перезапустить Web-сервер.


Изменение уровня проверки ошибок в сценарии

Если вы хотите установить уровень проверки ошибок для конкретного сценария, добавьте в начало сценария команду error_reporting(ОПЦИИ);

ОПЦИИ— это одна из встроенных констант, рассмотренных в предыдущем разделе. Например, добавив в начало сценария следующую инструкцию, можно обеспечить вывод всех сообщений об ошибках, предупреждений и уведомлений: error_reporting(E_ALL);

Предположим, что в файле php.ini уровень обработки ошибок установлен в значение E_ALL. Такой уровень обработки ошибок может вполне подходит для разработки сценариев, но после передачи сценария пользователям желательно отменить вывод уведомлений. Чтобы отменить настройки, заданные в файле php.ini, можно добавить к готовому сценарию инструкцию error_reporting(E_ALL & ~E_N0TICE);

Можно так определить уровень обработки ошибок, чтобы не отображались никакие сообщения. Для этого используйте команду error_reporting(0);

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


Запись сообщений в файл журнала

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

В журнал можно записывать сообщения об ошибках для всего узла. Для этого следует внести изменения в файл php.ini, если вы имеете к нему доступ. Откройте файл php.ini и найдите строку log_errors=Off

Значение Off необходимо изменить на On. Нужно также указать, куда записывать сообщения об ошибках. Чтобы сделать это, найдите строку ;error_log=имя_файла

Теперь удалите точку с запятой в начале строки, превратив комментарий в действующую инструкцию. Замените значение имя_фашш на путь к файлу, в который вы хотите сохранять сообщения об ошибках. Например, можно использовать команду error_log=c:\temp\php_error_log

Необходимо указывать существующий каталог (в Windows он часто называется также папкой). Для того чтобы сообщения об ошибках можно было записывать в указанный файл, необходимо создать каталог с:\temp. При этом файл создавать не обязательно. Если интерпретатор РНР сможет найти указанный каталог, то он самостоятельно создаст требуемый файл.

Чтобы внесенные в файл php.ini изменения вступили в силу, необходимо перезапустить Web-сервер.


Расширенная обработка ошибок

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

Стандартных сообщений РНР об ошибках может оказаться недостаточно. Например вы чувствуете, что сценарий работает неправильно, хотя интерпретатор РНР не обнаруживает никаких ошибок. Допустим, вы пишете сценарий проектирования дома. В таком случае, (ели высота двери, определяемая переменной $height_of_door, больше высоты дома $height_of__house, — это явно неправильно. Вам это известно, а интерпретатору РНР — нет. Он не распознает эту ситуацию как ошибку. Чтобы интерпретатор РНР проверял эту ошибку в сценарии, можно написать следующий код:

i f ($height_of_door > $height_of_house)
{
     trigger_error ( "Impossiblecondition", E_USER_ERROR);
}

Параметр E_USER_ERROR свидетельствует о том, что условие является ошибочным. Строка Impossiblecondition является сообщением, которое будет отображаться при возникновении данной ошибки. Если условие истинно, будет выводиться следующее сообщение:

Fatal error: Impossible condition in d:\testerr.php on line 9

Сценарий остановится в этой точке, поскольку интерпретатору РНР было указано, что это ошибка, а не предупреждение или уведомление. Если в качестве параметра вместо E_USER_ERROR указать E_USER_WARNING или E_USER_NOTICE, то РНР будет обрабатывать данную ситуацию как предупреждение или уведомление соответственно.

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

if ($height_of_door > $height_of_house)
{
     echo "Это невозможно<Ьг>";
     exit();
}

Если значение $height_of_door больше значения переменной $height_of_housе, будет выведено сообщение об ошибке и функция exit() прервет выполнение сценария. Никакие операторы больше выполняться не будут.

Сообщение об ошибке можно записать в файл журнала, воспользовавшись функцией:

error_log (message, 3, имя_файла_журнала) ;

Например, можно использовать следующий блок if:

i f ($height_of_door > $height_of_house)
{
     error_log("Дверь выше дома", 3, "/temp/err_log" );
     exit() ;
}

После добавления в сценарий этого оператора, если значение $height_of_door превышает $height_of_house, в файл журнала /temp/err_log будет записано сообщение Дверь выше дома. Значение 3 в этом операторе означает запись сообщения в указанный файл журнала. При этом каталог /temp должен существовать. Если файла журнала не существует, интерпретатор РНР создаст его самостоятельно.

В качестве альтернативы в случае ошибки можно отправить себе почтовое сообщение. Для этой цели, так же как и для записи сообщения об ошибке в файл журнала, можно использовать оператор error_log. Значение 1 в списке параметров функции error_log означает передачу сообщения по указанному адресу электронной почты:

error_log ("Дверь выше дома", 1, "me@mymail.com");

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

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

set_error_handler(имя_функции);

Например, можно использовать следующую команду:

set_error_handler(my_error_handler);

Еще один метод обработки ошибок средствами языка РНР состоит в использовании функции die, которая выводит сообщение при некорректной работе функции.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz