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

Курс по основам языка программирования PHP.
W3Schools на русском языке. Уроки для начинающих



По умолчанию обработка ошибок в PHP очень проста. Сообщение об ошибке с именем файла, номером строки и сообщением об ошибке отправляется в браузер.


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

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

Это руководство содержит некоторые из наиболее распространенных методов проверки ошибок в PHP.

Мы покажем разные методы обработки ошибок:


Основная обработка ошибок: использование функции 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_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 регистрации.


W3Schools на русском уроки для начинающих для новичков основы языка курсы с нуля язык php обработка ошибок в PHP какие бывают ошибки в PHP error php примеры ошибок PHP скрипта


warning

Не выкладывайте свой код непосредственно в комментариях, он отображается некорректно. Воспользуйтесь такими сервисами, как jsfiddle.net, codepen.io, liveweave.com, jsbin.com, сохраните код на любом из этих сервисов и в комментариях дайте на него ссылку. Так будет виден и код, и результат.