ЛУЧШИЙ САЙТ ДЛЯ РАЗРАБОТЧИКОВ
×

PHP учебник

PHP HOME PHP Intro PHP Install PHP Syntax PHP Variables PHP Echo / Print PHP Data Types PHP Strings PHP Constants PHP Operators PHP If...Else...Elseif PHP Switch PHP While Loops PHP For Loops PHP Functions PHP Arrays PHP Sorting Arrays PHP Superglobals

PHP Forms

PHP Form Handling PHP Form Validation PHP Form Required PHP Form URL/E-mail PHP Form Complete

PHP Advanced

PHP Arrays Multi PHP Date and Time PHP Include PHP File Handling PHP File Open/Read PHP File Create/Write PHP File Upload PHP Cookies PHP Sessions PHP Filters PHP Filters Advanced PHP Error Handling PHP Exception

MySQL Database

MySQL Database MySQL Connect MySQL Create DB MySQL Create Table MySQL Insert Data MySQL Get Last ID MySQL Insert Multiple MySQL Prepared MySQL Select Data MySQL Delete Data MySQL Update Data MySQL Limit Data

PHP - XML

PHP XML Parsers PHP SimpleXML Parser PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Intro AJAX PHP AJAX Database AJAX XML AJAX Live Search AJAX RSS Reader AJAX Poll

PHP Examples


PHP Reference

PHP Overview PHP Array PHP Calendar PHP Date PHP Directory PHP Error PHP Filesystem PHP Filter PHP FTP PHP HTTP PHP Libxml PHP Mail PHP Math PHP Misc PHP MySQLi PHP SimpleXML PHP String PHP XML PHP Zip PHP Timezones


PHP Error Handling


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


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

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

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

Мы будем показывать различные методы обработки ошибок:

  • Простые "Die ()" заявления
  • Пользовательские ошибки и триггеры ошибок
  • Отчеты об ошибках

Базовая обработка ошибок: использование функции Die ()

В первом примере показан простой скрипт, открывающий текстовый файл:

<?php
$file=fopen("welcome.txt","r");
?>

Если файл не существует вы можете получить сообщение об ошибке, как это:

Предупреждение: fopen (Welcome. txt) [функция. fopen]: не удалось открыть поток:
Нет такого файла или каталога в к:\вебфолдер\тест.ФП на линии 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 Ошибки времени выполнения, не являющиеся фатальными. Выполнение скрипта не остановлено
8 E_NOTICE Уведомления во время выполнения. Сценарий нашел то, что может быть ошибкой, но также может произойти при запуске сценария обычно
256 E_USER_ERROR Фатальная ошибка, генерируемая пользователем. Это как е_еррор, установленное программистом с помощью функции PHP trigger_error()
512 E_USER_WARNING Предупреждение, сгенерированное пользователем, не являющееся фатальным. Это как е_варнинг, установленное программистом с помощью функции PHP trigger_error()
1024 E_USER_NOTICE Уведомление, созданное пользователем. Это как е_нотице, установленное программистом с помощью функции PHP trigger_error()
4096 E_RECOVERABLE_ERROR Устранимая фатальная ошибка. Это похоже на е_еррор, но может быть перехвачено определяемым пользователем дескриптором (см. также set_error_handler())
8191 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
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
?>

Результат приведенного выше кода должен быть примерно таким:

Error: [8] Undefined variable: test

Вызвать ошибку

В сценарии, где пользователи могут вводить данные, полезно вызвать ошибки при незаконном вводе. В PHP это делается trigger_error() функцией.

Пример

В этом примере возникает ошибка, если переменная "Test" больше "1":

<?php
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below");
}
?>

Результат приведенного выше кода должен быть примерно таким:

Обратите внимание: значение должно быть 1 или ниже
в к:\вебфолдер\тест.ФП на линии 6

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

Возможные типы ошибок:

  • E_USER_ERROR - Фатальная ошибка времени выполнения, генерируемая пользователем. Ошибки, которые не могут быть восстановлены. Выполнение скрипта приостановлено
  • E_USER_WARNING - Предупреждение о времени выполнения, сгенерированное пользователем, не являющееся фатальным. Выполнение скрипта не остановлено
  • E_USER_NOTICE - По умолчанию. Уведомление о времени выполнения, сгенерированное пользователем. Сценарий нашел то, что может быть ошибкой, но также может произойти при запуске сценария обычно

Пример

В этом примере е_усер_варнинг происходит, если переменная "Test" больше, чем "1". При возникновении е_усер_варнинг мы будем использовать наш пользовательский обработчик ошибок и заканчивать сценарий:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

Результат приведенного выше кода должен быть примерно таким:

Ошибка: [512] значение должно быть 1 или ниже
Конечный сценарий

Теперь, когда мы научились создавать собственные ошибки и как их запускать, давайте взглянем на протоколирование ошибок.


Протоколирование ошибок

По умолчанию PHP отправляет журнал ошибок в систему регистрации сервера или файл, в зависимости от того, как еррор_лог конфигурация задается в файле PHP. ini. С помощью error_log() функции можно отправлять журналы ошибок в указанный файл или удаленное назначение.

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

Отправка сообщения об ошибке по электронной почте

В приведенном ниже примере мы отправим письмо с сообщением об ошибке и закончим сценарий, если возникает конкретная ошибка:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Webmaster has been notified";
  error_log("Error: [$errno] $errstr",1,
  "[email protected]","From: [email protected]");
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

Результат приведенного выше кода должен быть примерно таким:

Ошибка: [512] значение должно быть 1 или ниже
Вебмастеру было сообщено

И почта, полученная из вышеприведенного кода, выглядит так:

Ошибка: [512] значение должно быть 1 или ниже

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