Обработка ошибок в PHP
- Предыдущая страница PHP Безопасная E-mail
- Следующая страница PHP Exception
В PHP по умолчанию обработка ошибок проста. Сообщение отправляется в браузер, в котором содержится имя файла, номер строки и описание ошибки.
Обработка ошибок в PHP
Обработка ошибок является важной частью при создании скриптов и веб-приложений. Если ваше кодирование не включает обнаружение ошибок, это делает ваш код не очень профессиональным и открывает путь к безопасности.
Этот учебник介绍了 некоторые из наиболее важных методов обнаружения ошибок в PHP.
Мы расскажем вам о различных методах обработки ошибок:
- Простая команда "die()"
- Пользовательские ошибки и триггеры ошибок
- Отчет об ошибках
Основная обработка ошибок: использование функции die()
Пример простого скрипта для открытия текстового файла:
<?php $file=fopen("welcome.txt","r"); ?>
Если файл не существует, вы получите类似ное сообщение об ошибке:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php на строке 2
Чтобы избежать получения пользователем类似ного сообщения об ошибке, мы проверяем наличие файла перед его доступом:
<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?>
Теперь, если файл не существует, вы получите类似ное сообщение об ошибке:
Файл не найден
В отличие от предыдущего кода,上面的 код более эффективен, так как он использует простую схему обработки ошибок, которая останавливает скрипт после ошибки.
Однако, просто прерывание скрипта не всегда является подходящим способом. Давайте рассмотрим альтернативные PHP-функции для обработки ошибок.
Создание пользовательского обработчика ошибок
Создание пользовательского обработчика ошибок очень просто. Мы просто создали专用ную функцию, которую можно вызвать при возникновении ошибки в PHP.
Эта функция должна быть способна обрабатывать по крайней мере два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (дополнительные: файл, номер строки и контекст ошибки):
Синтаксис
error_function(error_level, error_message, error_file, error_line, error_context)
Параметр | Описание |
---|---|
error_level | Обязателен. Уровень отчета об ошибках, определенный пользователем. Это должно быть значение. См. таблицу ниже: уровень отчета об ошибках. |
error_message | Обязателен. Ошибочное сообщение, определенное пользователем. |
error_file | Опционально. Определяет имя файла, в котором произошла ошибка. |
error_line | Опционально. Определяет номер строки, в которой произошла ошибка. |
error_context | Опционально. Определяет массив, который содержит все переменные, используемые при возникновении ошибки, и их значения. |
Уровень отчета об ошибках
Эти уровни отчетов об ошибках представляют различные типы ошибок, которые обработчик ошибок предназначен для обработки:
Значение | Константа | Описание |
---|---|---|
2 | E_WARNING | Невозможные ошибки run-time. Не останавливают выполнение сценария. |
8 | E_NOTICE | Run-time уведомления. Сценарий обнаруживает, что может произойти ошибка, но это также может произойти, когда сценарий выполняется normalmente. |
256 | E_USER_ERROR | Катастрофические ошибки пользователя. Аналогичны E_ERROR, которые устанавливаются программистом с помощью функции PHP trigger_error(). |
512 | E_USER_WARNING | Невозможные уведомления пользователя. Аналогичны E_WARNING, которые устанавливаются программистом с помощью функции PHP trigger_error(). |
1024 | E_USER_NOTICE | Уведомления, созданные пользователем. Аналогичны E_NOTICE, которые устанавливаются программистом с помощью функции PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Катастрофические ошибки, которые можно捕获. Аналогичны E_ERROR, но могут быть捕获лены пользовательскими обработчиками ошибок (см. set_error_handler()). |
8191 | E_ALL | Все ошибки и предупреждения, кроме уровня E_STRICT. (В PHP 6.0 E_STRICT является частью E_ALL) |
Теперь давайте создадим функцию обработки ошибок:
function customError($errno, $errstr) { echo "<b>Ошибка:</b> [$errno] $errstr<br />"; echo "Конец скрипта"; die(); }
Приведенный выше код - это простая функция обработки ошибок. При ее вызове она получает уровень ошибки и сообщение об ошибке. Затем она выводит уровень ошибки и сообщение и останавливает выполнение скрипта.
Теперь, когда мы создали функцию обработки ошибок, нам нужно определить, когда должна быть вызвана эта функция.
Set Error Handler
Default error handler в PHP - это встроенный обработчик ошибок. Мы намерены преобразовать функцию, которую мы видим выше, в стандартный обработчик ошибок для выполнения скрипта.
Ошибка обработчик можно изменить, чтобы он применялся только к определенным ошибкам, что позволяет скрипту обрабатывать различные ошибки по-разному. Однако, в данном примере мы намерены использовать наш пользовательский обработчик ошибок для всех ошибок:
set_error_handler("customError");
Поскольку мы хотим, чтобы наши пользовательские функции обрабатывали все ошибки, set_error_handler() требует всего одного параметра, но можно добавить второй параметр для определения уровня ошибки.
Пример
Чтобы проверить этот обработчик ошибок, попробуйте вывести не существующую переменную:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Ошибка:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
Вывод вышеуказанного кода должен быть подобен следующему:
Ошибка: [8] Неопределенная переменная: test
Вызвать ошибку
В местах ввода данных пользователя в сценарии, где возникает ошибка при неэффективных данных пользователя, это очень полезно. В PHP эту задачу выполняет функция trigger_error().
Пример
В этом примере, если переменная "test" больше "1", возникает ошибка:
<?php $test=2; if ($test>1) { trigger_error("Значение должно быть 1 или меньше"); } ?>
Вывод вышеуказанного кода должен быть подобен следующему:
Notice: Значение должно быть 1 или меньше в C:\webfolder\test.php на строке 6
Вы можете вызывать ошибки в любом месте сценария, используя второй параметр, вы можете определить уровень вызываемой ошибки.
Возможные типы ошибок:
- E_USER_ERROR - смертельная ошибка о времени выполнения, созданная пользователем. Ошибка не может быть восстановлена. Выполнение сценария прерывается.
- E_USER_WARNING - не смертельная ошибка о времени выполнения, созданная пользователем. Выполнение сценария не прерывается.
- E_USER_NOTICE - по умолчанию. Уведомления о времени выполнения, созданные пользователем. Сценарий обнаружил возможную ошибку, также может возникать, когда сценарий выполняется normalmente.
Пример
В этом примере, если переменная "test" больше "1", возникает ошибка E_USER_WARNING. Если возникает E_USER_WARNING, мы используем наш пользовательский обработчик ошибок и завершаем скрипт:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Ошибка:</b> [$errno] $errstr<br />"; echo "Конец скрипта"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Значение должно быть 1 или меньше",E_USER_WARNING); } ?>
Вывод вышеуказанного кода должен быть подобен следующему:
Ошибка: [512] Значение должно быть 1 или меньше Конец скрипта
Теперь我们已经学习了如何创建自己的 ошибки и как их вызывать, теперь давайте рассмотрим запись ошибок.
Запись ошибок
По умолчанию, в зависимости от конфигурации error_log в php.ini, PHP отправляет записи об ошибках в системный журнал ошибок сервера или в файл. Используя функцию error_log(), вы можете отправлять записи об ошибках в указанный файл или удаленную цель.
Отправка сообщения об ошибке себе по электронной почте - это hyvä способ получить уведомление о заданном ошибке.
Ошибка отправки через E-Mail
В следующем примере, если происходит определенная ошибка, мы отправим электронное письмо с сообщением об ошибке и завершим скрипт:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Ошибка:</b> [$errno] $errstr<br />"; echo "Администратор сайта уведомлен"; error_log("Ошибка: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Значение должно быть 1 или меньше",E_USER_WARNING); } ?>
Вывод вышеуказанного кода должен быть подобен следующему:
Ошибка: [512] Значение должно быть 1 или меньше Администратор сайта уведомлен
Почта, полученная от вышеуказанного кода, ähnelt dem folgenden:
Ошибка: [512] Значение должно быть 1 или меньше
Этот метод не подходит для всех ошибок. Обычные ошибки должны быть записаны на сервере с использованием стандартной системы записи PHP.
- Предыдущая страница PHP Безопасная E-mail
- Следующая страница PHP Exception