Время на прочтение
6 мин
Количество просмотров 67K
В статье представлена очередная попытка разобраться с ошибками, которые могут встретиться на вашем пути php-разработчика, их возможная классификация, примеры их возникновения, влияние ошибок на ответ клиенту, а также инструкции по написанию своего обработчика ошибок.
Статья разбита на четыре раздела:
- Классификация ошибок.
- Пример, демонстрирующий различные виды ошибок и его поведение при различных настройках.
- Написание собственного обработчика ошибок.
- Полезные ссылки.
Классификация ошибок
Все ошибки, условно, можно разбить на категории по нескольким критериям.
Фатальность:
- Фатальные
Неустранимые ошибки. Работа скрипта прекращается.
E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR. - Не фатальные
Устранимые ошибки. Работа скрипта не прекращается.
E_WARNING, E_NOTICE, E_CORE_WARNING, E_COMPILE_WARNING, E_USER_WARNING, E_USER_NOTICE, E_STRICT, E_DEPRECATED, E_USER_DEPRECATED. - Смешанные
Фатальные, но только, если не обработаны функцией, определенной пользователем в set_error_handler().
E_USER_ERROR, E_RECOVERABLE_ERROR.
Возможность перехвата ошибки функцией, определенной в set_error_handler():
- Перехватываемые (не фатальные и смешанные)
E_USER_ERROR, E_RECOVERABLE_ERROR, E_WARNING, E_NOTICE, E_USER_WARNING, E_USER_NOTICE, E_STRICT, E_DEPRECATED, E_USER_DEPRECATED. - Не перехватываемые (фатальные)
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING.
Инициатор:
- Инициированы пользователем
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE. - Инициированы PHP
E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_WARNING, E_NOTICE, E_CORE_WARNING, E_COMPILE_WARNING, E_STRICT, E_DEPRECATED, E_USER_DEPRECATED, E_USER_ERROR, E_RECOVERABLE_ERROR.
Для нас, в рамках данной статьи, наиболее интересны классификации по первым двум критериям, о чем будет рассказано далее.
Примеры возникновения ошибок
Листинг index.php
<?php
// определеяем уровень протоколирования ошибок
error_reporting(E_ALL | E_STRICT);
// определяем режим вывода ошибок
ini_set('display_errors', 'On');
// подключаем файл с ошибками
require 'errors.php';
Листинг errors.php
<?php
echo "Файл с ошибками. Начало<br>";
/*
* перехватываемые ошибки (ловятся функцией set_error_handler())
*/
// NONFATAL - E_NOTICE
// echo $undefined_var;
// NONFATAL - E_WARNING
// array_key_exists('key', NULL);
// NONFATAL - E_DEPRECATED
split('[/.-]', "12/21/2012"); // split() deprecated начиная с php 5.3.0
// NONFATAL - E_STRICT
// class c {function f(){}} c::f();
// NONFATAL - E_USER_DEPRECATED
// trigger_error("E_USER_DEPRECATED", E_USER_DEPRECATED);
// NONFATAL - E_USER_WARNING
// trigger_error("E_USER_WARNING", E_USER_WARNING);
// NONFATAL - E_USER_NOTICE
// trigger_error("E_USER_NOTICE", E_USER_NOTICE);
// FATAL, если не обработана функцией set_error_handler - E_RECOVERABLE_ERROR
// class b {function f(int $a){}} $b = new b; $b->f(NULL);
// FATAL, если не обработана функцией set_error_handler - E_USER_ERROR
// trigger_error("E_USER_ERROR", E_USER_ERROR);
/*
* неперехватываемые (не ловятся функцией set_error_handler())
*/
// FATAL - E_ERROR
// undefined_function();
// FATAL - E_PARSE
// parse_error
// FATAL - E_COMPILE_ERROR
// $var[];
echo "Файл с ошибками. Конец<br>";
Примечание: для полной работоспособности скрипта необходим PHP версии не ниже 5.3.0.
В файле errors.php представлены выражения, инициирующие практически все возможные ошибки. Исключение составили: E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_WARNING, генерируемые ядром Zend. В теории, встретить их в реальной работе вы не должны.
В следующей таблице приведены варианты поведения этого скрипта в различных условиях (в зависимости от значений директив display_errors и error_reporting):
| Группа ошибок | Значения директив* | Статус ответа сервера | Ответ клиенту** |
|---|---|---|---|
| E_PARSE, E_COMPILE_ERROR*** | display_errors = off error_reporting = ANY |
500 | Пустое значение |
| display_errors = on error_reporting = ANY |
200 | Сообщение об ошибке | |
| E_USER_ERROR, E_ERROR, E_RECOVERABLE_ERROR | display_errors = off error_reporting = ANY |
500 | Вывод скрипта до ошибки |
| display_errors = on error_reporting = ANY |
200 | Сообщение об ошибке и вывод скрипта до ошибки | |
| Не фатальные ошибки | display_errors = off error_reporting = ANY и display_errors = on error_reporting = 0 |
200 | Весь вывод скрипта |
| display_errors = on error_reporting = E_ALL | E_STRICT |
200 | Сообщение об ошибке и весь вывод скрипта |
* Значение ANY означает E_ALL | E_STRICT или 0.
** Ответ клиенту может отличаться от ответов на реальных скриптах. Например, вывод какой-либо информации до включения файла errors.php, будет фигурировать во всех рассмотренных случаях.
*** Если в файле errors.php заменить пример для ошибки E_COMPILE_ERROR на require "missing_file.php";, то ошибка попадет во вторую группу.
Значение, приведенной выше, таблицы можно описать следующим образом:
- Наличие в файле скрипта ошибки, приводящей его в «негодное» состояние (невозможность корректно обработать), на выходе даст пустое значение или же только само сообщение об ошибке, в зависимости от значения директивы display_errors.
- Скрипт в файле с фатальной ошибкой, не относящейся к первому пункту, будет выполняться в штатном режиме до самой ошибки.
- Наличие в файле фатальной ошибки при display_errors = Off обозначит 500 статус ответа.
- Не фатальные ошибки, как и следовало ожидать, в контексте возможности исполнения скрипта в целом, на работоспособность не повлияют.
Собственный обработчик ошибок
Для написания собственного обработчика ошибок необходимо знать, что:
- для получения информации о последней произошедшей ошибке существует функция error_get_last();
- для определения собственного обработчика ошибок существует функция set_error_handler(), но фатальные ошибки нельзя «перехватить» этой функцией;
- используя register_shutdown_function(), можно зарегистрировать свою функцию, выполняемую по завершении работы скрипта, и в ней, используя знания из первого пункта, если фатальная ошибка имела место быть, предпринять необходимые действия;
- сообщение о фатальной ошибке в любом случае попадет в буфер вывода;
- воспользовавшись функциями контроля вывода можно предотвратить отображение нежелательной информации;
- при использовании оператора управления ошибками (знак @) функция, определенная в set_error_handler() все равно будет вызвана, но функция error_reporting() в этом случае вернет 0, чем и можно пользоваться для прекращения работы или определения другого поведения своего обработчика ошибок.
Третий пункт поясню: зарегистрированная нами функция при помощи register_shutdown_function() выполнится в любом случае — корректно ли завершился скрипт, либо же был прерван в связи с критичной (фатальной) ошибкой. Второй вариант мы можем однозначно определить, воспользовавшись информацией предоставленной функцией error_get_last(), и, если ошибка все же была, выполнить наш собственный обработчик ошибок.
Продемонстрируем вышесказанное на модифицированном скрипте index.php:
<?php
/**
* Обработчик ошибок
* @param int $errno уровень ошибки
* @param string $errstr сообщение об ошибке
* @param string $errfile имя файла, в котором произошла ошибка
* @param int $errline номер строки, в которой произошла ошибка
* @return boolean
*/
function error_handler($errno, $errstr, $errfile, $errline)
{
// если ошибка попадает в отчет (при использовании оператора "@" error_reporting() вернет 0)
if (error_reporting() & $errno)
{
$errors = array(
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_CORE_ERROR => 'E_CORE_ERROR',
E_CORE_WARNING => 'E_CORE_WARNING',
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_STRICT => 'E_STRICT',
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
E_DEPRECATED => 'E_DEPRECATED',
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
);
// выводим свое сообщение об ошибке
echo "<b>{$errors[$errno]}</b>[$errno] $errstr ($errfile на $errline строке)<br />\n";
}
// не запускаем внутренний обработчик ошибок PHP
return TRUE;
}
/**
* Функция перехвата фатальных ошибок
*/
function fatal_error_handler()
{
// если была ошибка и она фатальна
if ($error = error_get_last() AND $error['type'] & ( E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR))
{
// очищаем буффер (не выводим стандартное сообщение об ошибке)
ob_end_clean();
// запускаем обработчик ошибок
error_handler($error['type'], $error['message'], $error['file'], $error['line']);
}
else
{
// отправка (вывод) буфера и его отключение
ob_end_flush();
}
}
// определеяем уровень протоколирования ошибок
error_reporting(E_ALL | E_STRICT);
// определяем режим вывода ошибок
ini_set('display_errors', 'On');
// включаем буфферизацию вывода (вывод скрипта сохраняется во внутреннем буфере)
ob_start();
// устанавливаем пользовательский обработчик ошибок
set_error_handler("error_handler");
// регистрируем функцию, которая выполняется после завершения работы скрипта (например, после фатальной ошибки)
register_shutdown_function('fatal_error_handler');
require 'errors.php';
Не забываем, что ошибки смешанного типа, после объявления собственного обработчика ошибок, стали не фатальными. Плюс к этому, весь вывод скрипта до фатальной ошибки вместе с стандартным сообщением об ошибке будет сброшен.
Вообще, рассмотренный пример обработчика ошибок, обработкой, как таковой, не занимается, а только демонстрирует саму возможность. Дальнейшее его поведение зависит от ваших желаний и/или требований. Например, все случаи обращения к обработчику можно записывать в лог, а в случае фатальных ошибок, дополнительно, уведомлять об этом администратора ресурса.
Полезные ссылки
- Первоисточник: php.net/manual/ru/book.errorfunc.php
- Описание ошибок: php.net/manual/ru/errorfunc.constants.php
- Функции контроля вывода: php.net/manual/ru/ref.outcontrol.php
- Побитовые операторы: php.net/manual/ru/language.operators.bitwise.php и habrahabr.ru/post/134557
- Тематически близкая статья: habrahabr.ru/post/134499
Change language:
Submit a Pull Request
Report a Bug
Table of Contents
- Basics
- Errors in PHP 7
Introduction
Sadly, no matter how careful we are when writing our code, errors are a
fact of life. PHP will report errors, warnings and notices for many common
coding and runtime problems, and knowing how to detect and handle these
errors will make debugging much easier.
+add a note
User Contributed Notes
There are no user contributed notes for this page.
Иногда ваше приложение не запускается должным образом, что приводит к ошибкам. Есть ряд причин, которые могут вызвать ошибки, например:
- Веб-серверу может не хватить места на диске;
- Пользователь мог ввести недопустимое значение в поле формы;
- Файл или запись базы данных, к которой вы пытались получить доступ, возможно, не существует;
- Приложение может не иметь разрешения на запись в файл на диске;
- Служба, к которой приложение должно получить доступ, может быть временно недоступна.
Эти типы ошибок известны как ошибки времени выполнения, потому что они возникают во время выполнения скрипта. Они отличаются от синтаксических ошибок, которые необходимо исправлять перед запуском скриптов.
Профессиональное приложение должно иметь возможность изящно обрабатывать такие ошибки времени выполнения. Обычно это означает более четкое и точное информирование пользователя о проблеме.
Понимание уровней ошибок
Обычно, когда возникает проблема, препятствующая правильной работе скрипта, механизм PHP выдает ошибку. Каждая ошибка представлена целым числом и соответствующей константой. В следующей таблице перечислены некоторые из распространенных уровней ошибок:
| Название | Значение | Описание |
|---|---|---|
E_ERROR |
1 |
Неустранимая ошибка времени выполнения от которой невозможно избавиться. Выполнение скрипта немедленно прекращается. |
E_WARNING |
2 |
Предупреждение во время выполнения. Она несущественна, и большинство ошибок попадают в эту категорию. Выполнение скрипта не останавливается. |
E_NOTICE |
8 |
Уведомление во время выполнения. Указывает, что скрипт обнаружил что-то, что могло быть ошибкой, хотя такая ситуация также может возникнуть при обычном запуске скрипта. |
E_USER_ERROR |
256 |
Сообщение о фатальной пользовательской ошибке. Она похожа на E_ERROR, за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error(). |
E_USER_WARNING |
512 |
Предупреждающее сообщение, созданное пользователем без фатального исхода. Она похожа на E_WARNING, за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error(). |
E_USER_NOTICE |
1024 |
Сообщение с уведомлением, созданное пользователем. Она похожа на E_NOTICE за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error(). |
E_STRICT |
2048 |
Не совсем ошибка, но срабатывает всякий раз, когда PHP встречает код, который может привести к проблемам или несовместимости пересылки. |
E_ALL |
8191 |
Все ошибки и предупреждения, кроме E_STRICT до PHP 5.4.0. |
Дополнительные сведения об уровнях ошибок см. в справочнике по уровням ошибок PHP.
Механизм PHP вызывает ошибку всякий раз, когда он сталкивается с проблемой в вашем скрипте, но вы также можете инициировать ошибки самостоятельно, чтобы генерировать более удобные сообщения об ошибках. Таким образом вы можете сделать свое приложение более сложным. В следующем разделе описаны некоторые из распространенных методов, используемых для обработки ошибок в PHP:
Базовая обработка ошибок с помощью функции die()
Рассмотрим следующий пример, в котором просто попытаемся открыть текстовый файл только для чтения.
<?php
// Пробуем открыть несуществующий файл
$file = fopen("sample.txt", "r"); // Выводит: Warning: fopen(sample.txt) [function.fopen]: failed to open stream: No such file or directory in C:\wamp\www\project\test.php on line 2
?>
Если мы выполним несколько простых шагов, мы сможем предотвратить получение пользователями такого сообщения об ошибке.
<?php
if(file_exists("sample.txt")){
$file = fopen("sample.txt", "r");
} else{
die("Error: The file you are trying to access doesn't exist.");
}
?>
Как вы можете видеть, реализовав простую проверку, существует ли файл перед попыткой доступа к нему, мы можем сгенерировать сообщение об ошибке, которое будет более понятным для пользователя.
Используемая выше функция die() просто отображает пользовательское сообщение об ошибке и завершает текущий скрипт, если файл sample.txt не найден.
Создание собственного обработчика ошибок
Вы можете создать свою собственную функцию обработчика ошибок, чтобы справляться с ошибкой времени выполнения, генерируемой механизмом PHP. Пользовательский обработчик ошибок обеспечивает большую гибкость и лучший контроль над ошибками; он может проверять ошибку и решать, что с ней делать — отображать сообщение пользователю, регистрировать ошибку в файле или базе данных или отправлять по электронной почте, попытаться исправить проблему и продолжить, выйти из выполнения скрипта или вообще игнорировать ошибку.
Функция пользовательского обработчика ошибок должна иметь возможность обрабатывать как минимум два параметра (errno и errstr), однако она может дополнительно принимать три дополнительных параметра (errfile, errline и errcontext), как описано ниже:
| Параметр | Описание |
|---|---|
| Обязательно — следующие параметры обязательны | |
| errno. | Задает уровень ошибки в виде целого числа. Это соответствует соответствующей константе уровня ошибки (E_ERROR, E_WARNING и т. д.). |
| errstr. | Задает сообщение об ошибке в виде строки. |
| Опционально — следующие параметры являются необязательными | |
| errfile. | Задает имя файла скрипта, в котором произошла ошибка. |
| errline. | Задает номер строки, в которой произошла ошибка. |
| errcontext. | Задает массив, содержащий все переменные и их значения, которые существовали на момент возникновения ошибки. Полезно для отладки. |
Вот пример простой пользовательской функции обработки ошибок. Этот обработчик customError() запускается всякий раз, когда возникает ошибка, какой бы тривиальной она ни была. Затем он выводит сведения об ошибке в браузер и останавливает выполнение скрипта.
<?php
// Функция обработчика ошибок
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
?>
Вам нужно указать PHP, чтобы он использовал вашу пользовательскую функцию обработчика ошибок — просто вызовите встроенную функцию set_error_handler(), передав имя функции.
<?php
// Функция обработчика ошибок
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
// Устанавливаем обработчик ошибок
set_error_handler("customError");
// Вызываем ошибку
echo($test);
?>
Регистрация ошибок
Журнал сообщений об ошибках в текстовом файле
Вы также можете записать подробную информацию об ошибке в файл журнала, например:
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "\r\n";
error_log($message, 3, "logs/app_errors.log");
die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>
Отправка сообщений об ошибках по электронной почте
Вы также можете отправить электронное письмо с подробностями об ошибке, используя ту же функцию error_log().
<?php
function calcDivision($dividend, $divisor){
if ($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "\r\n";
error_log($message, 1, "webmaster@example.com");
die("There was a problem, please try again. Error report submitted to webmaster.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>
Вызов ошибок
Хотя движок PHP выдает ошибку всякий раз, когда он сталкивается с проблемой в вашем скрипте, вы также можете вызвать ошибки самостоятельно. Это может помочь сделать ваше приложение более надежным, поскольку оно может выявлять потенциальные проблемы до того, как они перерастут в серьезные ошибки.
Чтобы вызвать ошибку в скрипте, вызовите функцию trigger_error(), передав сообщение об ошибке, которое вы хотите сгенерировать:
trigger_error("There was a problem.");
Рассмотрим следующую функцию, которая вычисляет деление двух чисел.
<?php
function calcDivision($dividend, $divisor){
return($dividend / $divisor);
}
// Вызываем функцию
echo calcDivision(10, 0); // Выводит: Warning: Division by zero in C:\wamp\www\project\test.php on line 3
?>
Это сообщение выглядит не очень информативным. Рассмотрим следующий пример, в котором для генерации ошибки используется функция trigger_error().
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("Делитель не может быть нулевым", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
// Вызываем функцию
echo calcDivision(10, 0); // Выводит: Warning: Делитель не может быть нулевым C:\wamp\www\project\error.php on line 4
?>
Как видите, сообщение об ошибке, созданное во втором примере, более четко объясняет проблему по сравнению с предыдущим.

PHP — это достаточно свободный язык программирования, и это, на мой взгляд, большой минус. Главным недостатком здесь является то, что некоторые конструкции, которые в других языках сразу же отключат выполнение программы, в PHP является нормой и вполне допустимыми. Но если Вы хотите писать код изначально грамотно, то Вам необходимо знать о том, как выводить ошибки разных уровней.
В PHP есть несколько уровней ошибок, которые представлены в таблице ниже:
| E_WARNING | Различного рода предупреждения. Например, если функция требует 3 параметра, а Вы передаёте только 2, то будет как раз ошибка уровня E_WARNING. |
| E_NOTICE | Примерно то же самое, что и E_WARNING, но ошибки это очень мелкие, и они лишь могут стать причиной ошибок в будущем. Пример: использование неинициализированной переменной. Могу сказать, что данный уровень ошибок встречается практически в каждом мало-мальски сложном скрипте. |
| E_DEPRECATED | Данный уровень ошибок возникает при использовании устаревших конструкций, например, при вызове какой-нибудь старой функции. |
| E_PARSE | Ошибка синтаксического характера. Например, забыли поставить круглую скобку. |
| E_ERROR | Ошибка, которая нам хорошо знакома. Как правило, мы её видем чаще всего. Самый простой пример — это вызов несуществующей функции. |
| E_ALL | Все ошибки. |
На большинстве серверов стоит вывод ошибок уровня E_WARNING, E_PARSE и E_ERROR. То есть очень грубые замечания и фатальные ошибки. Если Вы хотите программировать профессионально, то контроль только таких ошибок не достаточен.
Я рекомендую на этапе создания проекта включать вывод уровня ошибок E_ALL. Сделать это очень просто:
<?php
error_reporting(E_ALL);
?>
И так нужно писать перед началом каждого скрипта. Если данный способ сильно не удобен, и Вы имеете доступ к php.ini, то в этом файле найдите директиву error_reporting и поставьте у неё значение E_ALL.
Если Вы с выводом такого уровня ошибок в PHP напишите код без единого замечания, то, значит, Вы создали, как минимум, неплохой продукт. Когда будете выкладывать уже на хостинг, то рекомендую данный уровень ошибок стереть, чтобы они не появлялись время от времени. Ведь PHP тоже обновляется и сегодня новые конструкции завтра могут уже устареть. И чтобы не вызывать ошибку уровня E_DEPRECATED, рекомендую отключать отображение подобных ошибок.
-
Создано 03.10.2012 08:13:35
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Обработка ошибок по умолчанию в 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 on line 2
Чтобы запретить пользователю получать сообщение об ошибке, как показано выше, мы проверяем, существует ли файл, прежде чем мы пытаемся получить к нему доступ:
<?php
if(!file_exists(«welcome.txt»)) {
die(«File not found»);
}
else {
$file=fopen(«welcome.txt»,»r»);
}
?>
Теперь, если файл не существует, вы получите сообщение об ошибке, как это:
Код выше является более эффективным, чем ранее кода, так как он использует простой механизм обработки ошибок, чтобы остановить скрипт после ошибки.
Однако, просто остановить скрипт не всегда правильный путь. Давайте посмотрим на альтернативные функции PHP для обработки ошибок.
Создание пользовательского обработчика ошибок
Создание обработчика ошибок довольно просто. Мы просто создаем специальную функцию, которая может быть вызвана, когда возникает ошибка в PHP.
Эта функция должна быть в состоянии обрабатывать как минимум два параметров (уровень ошибок и сообщение об ошибке) , но может принимать до пяти параметров (optionally: file, line-number, and the error context) :
Синтаксис
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 | Catchable фатальная ошибка. Это как E_ERROR , но может быть перехвачено определенным пользователем ручки (see also set_error_handler() ) |
| 8191 | E_ALL | Все ошибки и предупреждения (E_STRICT became a part of E_ALL in 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
Trigger ошибки
В сценарии, где пользователи могут вводить данные полезно вызвать ошибки при возникновении недопустимого ввода. В PHP это делается с помощью trigger_error() функции.
пример
В этом примере ошибка возникает , если «test» переменная больше , чем «1» :
<?php
$test=2;
if ($test>=1)
{
trigger_error(«Value must be 1 or below»);
}
?>
Выход выше код должен быть что-то вроде этого:
Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6
Ошибка может быть вызвана в любом месте вы хотите в сценарии, и путем добавления второго параметра вы можете указать, что срабатывает уровень ошибки.
Возможные типы ошибок:
- E_USER_ERROR — Fatal пользователей ошибка времени выполнения. Ошибки, которые не могут быть восстановлены из. Выполнение скрипта останавливается
- E_USER_WARNING — Некритические пользователи предупреждения во время выполнения. Выполнение скрипта не остановлено
- E_USER_NOTICE — по умолчанию. Пользователь генерируемого во время выполнения уведомления. Сценарий нашел что-то, что может быть ошибкой, но может также произойти при выполнении сценария нормально
пример
В этом примере E_USER_WARNING происходит , если «test» переменная больше , чем «1» . При возникновении E_USER_WARNING мы будем использовать наш обработчик ошибок и закончить сценарий:
<?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);
}
?>
Выход выше код должен быть что-то вроде этого:
Error: [512] Value must be 1 or below
Ending Script
Теперь, когда мы научились создавать свои собственные ошибки и как вызвать их, давайте посмотрим на ведение журнала ошибок.
Ведение журнала ошибок
По умолчанию, PHP отправляет журнал ошибок в системе регистрации сервера или файла, в зависимости от того, как конфигурация error_log установлен в файле php.ini. При использовании error_log() функции вы можете отправить журналы ошибок в указанный файл или удаленный пункт назначения.
Отправка сообщения об ошибках в себя по электронной почте может быть хорошим способом получать уведомления о конкретных ошибках.
Отправить сообщение об ошибке по E-Mail
В примере ниже мы будем посылать электронную почту с сообщением об ошибке и завершить сценарий, если возникает специфическая ошибка:
<?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,
«som[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);
}
?>
Выход выше код должен быть что-то вроде этого:
Error: [512] Value must be 1 or below
Webmaster has been notified
И почта, полученная из приведенной выше коды выглядит следующим образом:
Error: [512] Value must be 1 or below
Это не должно использоваться со всеми ошибками. Обычные ошибки должны быть авторизованы на сервере, используя систему по умолчанию протоколирования PHP.

