PHP 5 Обработка ошибок
Курс по основам языка программирования PHP.
W3Schools на русском языке. Уроки для начинающих
По умолчанию обработка ошибок в PHP очень проста. Сообщение об ошибке с именем файла, номером строки и сообщением об ошибке отправляется в браузер.
PHP Обработка ошибок
При создании скриптов и веб-приложений обработка ошибок является важной частью. Если в вашем коде отсутствует код проверки ошибок, ваша программа может выглядеть очень непрофессионально, и вы можете быть подвержены угрозам безопасности.
Это руководство содержит некоторые из наиболее распространенных методов проверки ошибок в PHP.
Мы покажем разные методы обработки ошибок:
- Простые выражения "die()"
- Пользовательские ошибки и триггеры ошибок
- Отчет об ошибках
Основная обработка ошибок: использование функции die()
Die - (перевод с анг.) - умереть.
В первом примере показан простой скрипт, который открывает текстовый файл:
<?php
$file=fopen("welcome.txt","r");
?>
Если файл не существует, вы можете получить такую ошибку:
Предупреждение: fopen(welcome.txt) [function.fopen]: не удалось открыть поток:
Нет такого файла или каталога C:\webfolder\test.php в строке 2
Чтобы пользователь не мог получить сообщение об ошибке, подобное приведенному выше, мы проверяем, существует ли файл, прежде чем пытаться получить к нему доступ:
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
}
else {
$file=fopen("welcome.txt","r");
}
?>
Теперь, если файл не существует, вы получаете сообщение об ошибке, подобное этому:
File not found (Файл не найден)
Приведенный выше код более эффективен, чем предыдущий, потому что он использует простой механизм обработки ошибок, чтобы остановить скрипт после ошибки.
Однако простая остановка скрипта - не всегда правильный путь. Давайте посмотрим на альтернативные функции 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 | Не фатальные ошибки времени выполнения. Выполнение скрипта не прекращается |
8 | E_NOTICE | Уведомления во время выполнения. Скрипт обнаружил что-то, что может быть ошибкой, но также может произойти при нормальном запуске скрипта |
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 стал частью E_ALL в PHP 5.4) |
Теперь давайте создадим функцию для обработки ошибок:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
Приведенный выше код представляет собой простую функцию обработки ошибок. Когда он запускается, он получает уровень ошибки и сообщение об ошибке. Затем он выводит уровень ошибки и сообщение и завершает скрипт.
Теперь, когда мы создали функцию обработки ошибок, нам нужно решить, когда она должна быть запущена.
Установить обработчик ошибок
Обработчиком ошибок по умолчанию для PHP является встроенный обработчик ошибок. Мы собираемся сделать функцию выше обработчика ошибок по умолчанию на время работы скрипта.
Можно изменить обработчик ошибок, чтобы он применялся только к некоторым ошибкам, чтобы скрипт мог по-разному обрабатывать разные ошибки. Однако в этом примере мы собираемся использовать наш собственный обработчик ошибок для всех ошибок:
set_error_handler("customError");
Поскольку мы хотим, чтобы наша пользовательская функция обрабатывала все ошибки, set_error_handler()
требовался только один параметр, можно добавить второй параметр, чтобы указать уровень ошибки.
Пример
Тестирование обработчика ошибок при попытке вывести переменную, которая не существует:
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//установить обработчик ошибок
set_error_handler("customError");
//ошибка триггера
echo($test);
?>
Вывод кода выше должен быть примерно таким:
Error: [8] Undefined variable: test
Вызвать ошибку
В скрипте, где пользователи могут вводить данные, полезно вызывать ошибки, когда происходит неправильный ввод. В PHP это делается функцией trigger_error()
.
Пример
В этом примере возникает ошибка, если переменная "test" больше "1":
<?php
$test=2;
if ($test>=1)
{
trigger_error("Значение должно быть 1 или меньше");
}
?>
Вывод кода выше должен быть примерно таким:
Уведомление: Значение должно быть 1 или меньше
C:\webfolder\test.php в строке 6
Ошибка может быть вызвана в любом месте скрипта, и, добавив второй параметр, вы можете указать уровень ошибки.
Возможные типы ошибок:
- E_USER_ERROR - Неустранимая пользовательская ошибка времени выполнения. Ошибки, которые невозможно восстановить. Выполнение скрипта остановлено
- E_USER_WARNING - Не фатальное предупреждение, генерируемое пользователем во время выполнения. Выполнение скрипта не прекращается
- E_USER_NOTICE - По умолчанию. Пользовательское уведомление во время выполнения. Скрипт обнаружил что-то, что может быть ошибкой, но также может произойти при нормальном запуске скрипта
Пример
В этом примере E_USER_WARNING происходит, если переменная "test" больше, чем "1". Если происходит E_USER_WARNING, мы будем использовать наш собственный обработчик ошибок и завершать скрипт:
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//установить обработчик ошибок
set_error_handler("customError",E_USER_WARNING);
//ошибка триггера
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
Вывод кода выше должен быть примерно таким:
Ошибка: [512] Значение должно быть 1 или меньше
Завершение скрипта
Теперь, когда мы научились создавать свои собственные ошибки и как их вызывать, давайте взглянем на регистрацию ошибок.
Регистрация ошибок
По умолчанию PHP отправляет журнал ошибок в систему журналов сервера или в файл, в зависимости от того, как в файле php.ini задана конфигурация error_log. Используя функцию error_log()
, вы можете отправлять журналы ошибок в указанный файл или в удаленное место назначения.
Отправка сообщений об ошибках себе по электронной почте может быть хорошим способом получения уведомлений о конкретных ошибках.
Отправка сообщения об ошибке по электронной почте
В приведенном ниже примере мы отправим электронное письмо с сообщением об ошибке и завершим работу скрипта, если произойдет конкретная ошибка:
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
//установить обработчик ошибок
set_error_handler("customError",E_USER_WARNING);
//ошибка триггера
$test=2;
if ($test>=1) {
trigger_error("Значение должно быть 1 или меньше",E_USER_WARNING);
}
?>
Вывод кода выше должен быть примерно таким:
Ошибка: [512] Значение должно быть 1 или меньше
Веб-мастер был уведомлен
И почта, полученная из кода выше, выглядит так:
Ошибка: [512] Значение должно быть 1 или меньше
Это не должно использоваться со всеми ошибками. Регулярные ошибки должны регистрироваться на сервере с использованием стандартной системы PHP регистрации.
Не выкладывайте свой код непосредственно в комментариях, он отображается некорректно. Воспользуйтесь такими сервисами, как jsfiddle.net, codepen.io, liveweave.com, jsbin.com, сохраните код на любом из этих сервисов и в комментариях дайте на него ссылку. Так будет виден и код, и результат.