Обработка ошибок с помощью trigger_error() и set_e

PHP предоставляет прекрасную возможность контролировать возникающие ошибки. Здесь мы поговорим о том, как обработать ошибку - сообщить (или не сообщить) о происшествии пользователю, в случае необходимости - сообщить администратору с помощью электронной почты, записать информацию о происшествии в log-файл. Итак, для начала давайте определимся, что такое ошибки в PHP. PHP поддерживает следующие уровни ошибок: E_ERROR E_WARNING E_PARSE E_NOTICE E_CORE_ERROR E_CORE_WARNING E_COMPILE_ERROR E_COMPILE_WARNING E_USER_ERROR E_USER_WARNING E_USER_NOTICE E_ALL E_STRICT На самом деле - это просто константы, которые используются для определения уровня обработки ошибок, построения бит-маски. Константы имеют "говорящие" имена. Глядя на константу - мы можем сказать, что ошибка уровня E_PARSE возникает в случае синтаксической ошибки, E_NOTICE - это напоминание программисту о нарушении "хорошего стиля" программирования на PHP. Несколько примеров: Когда соединение с базой данных MySQL (или другой) завершается неудачей - интерпретатор PHP сообщает об ошибке уровня E_WARNING Warning: mysql_connect(): Access denied for user: 'VVingless@localhost' (Using password: YES) In /home/mysite/index.php (line 83) Замечание: Для того чтобы интерпретатор PHP сообщал об ошибках - PHP должен быть настроен соответствующим образом: флаг display_errors должен быть включен - 1, директива error_reporting должна указывать на то, что необходимо отображать ошибки уровня E_WARNING (желательно конечно и другие). Если значения этих директив не удовлетворяют вашим требованиям - вы можете попробовать установить их самостоятельно, положив в папку со скриптом файл .htaccess (точка в начале имени обязательна) примерно такого содержания: php_flag display_errors on php_value error_reporting "E_ALL & ~E_NOTICE" Это означает, что сообщения об ошибках будут показываться, причем всех уровней, кроме E_NOTICE Когда программист допускает синтаксическую ошибку - интерпретатор PHP сообщает об ошибке уровня E_PARSE Parse error: parse error, unexpected '(', expecting T_STRING in /home/mysite/index.php on line 150 Но самые интересные для нас уровни ошибок - E_USER_ERROR и E_USER_WARNING. Как становится понятно из названия - это уровни ошибок, которые может устанавливать пользователь. Для этого существует функция trigger_error() - с её помощью, Вы можете сообщать пользователю о происшествии так, как это делает PHP. Как известно из руководства по PHP - функция trigger_error() принимает два параметра. void trigger_error ( string error_msg [, int error_type]) Первый параметр - текстовое сообщение об ошибке, например "файл не найден". Второй параметр - определяет уровень ошибки. Функция trigger_error() работает только с семейством ошибок E_USER - это значит, что вы можете установить ошибку уровня E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE и не можете установить ошибку уровня E_WARNING. Второй параметр является не обязательным, и по умолчанию принимает значение E_USER_NOTICE. Давайте попробуем: Допустим, наши данные для ленты новостей хранятся в файле news.txt, и если файл не найден - необходимо сообщить об ошибке. Текст программы будет выглядеть примерно так: if (!file_exists('/home/mysite/news.txt')) { trigger_error('News file not found'); } В результате интерпретатор PHP сообщит об ошибке уровня E_USER_NOTICE Notice: News file not found in /home/mysite/index.php on line 47 Но что нам это даёт? Для начала то, что если в php.ini или файле .htaccess были установлены директивы php_value log_errors "1" php_value log_errors_max_len "1024" php_value error_log "/home/mysite/my.log" То в файл /home/mysite/my.log автоматически будет добавлена запись о происшествии. [23-Mar-2004 13:52:03] PHP Notice: News file not found in /home/mysite/index.php on line 47 Далее, с помощью функции set_error_handler() мы можем установить свой собственный обработчик ошибок возникающих во время выполнения PHP скрипта. Как известно из мануала - в PHP 4 функция принимает один единственный строковый параметр - имя функции, которая будет выполняться каждый раз, когда происходит ошибка. PHP 5 даёт возможность установить ещё один параметр - тип ошибок которые будут обрабатываться с помощью нашего обработчика. Функция возвращает строку - имя функции обработчика, который был установлен до этого момента. string set_error_handler ( callback error_handler [, int error_types]) устанавливаем так set_error_handler ("my_error_handler"); Пользовательская функция, которая будет обрабатывать ошибки, может принимать следующие входные параметры: - код уровня ошибки - строковая интерпретация ошибки - имя файла, в котором произошла ошибка - строка, в которой произошла ошибка Следует так же заметить, что эта функция не может обрабатывать ошибки уровней E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING Это связанно с тем, что ошибки перечисленных уровней происходят до того, как интерпретатор получает информацию о пользовательском обработчике ошибок. Итак, объявляем нашу функцию function my_error_handler($code, $msg, $file, $line) { } Замечание: каждый более-менее объемный скрипт обычно разделяется на несколько файлов для удобства работы с ним. Как организовывать модульность программы - тема отдельно разговора. Сейчас же, я хочу лишь посоветовать выделять общие настройки в отдельный файл, который будет подключаться в начале программы с помощью инструкции include, либо с помощью директивы auto_prepend_file. В этот файл можно поместит и наш обработчик. Установка обработчика ошибок должна осуществится как можно ближе к началу программы, желательно в самом начале. Для того чтобы убедится что это действительно работает - создадим новый PHP файл, и попробуем запустить его Содержимое файла myerrortest.php <?php function my_error_handler($code, $msg, $file, $line) { echo "Произошла ошибка $msg ($code)

Скачать файл txt fb2
Добавил: Сталислав (14 янв 2009 г., 15:02)
Рейтинг: (0)
Прочитано: 13794