Функции Язык программирования PHP

set_error_handler

(PHP 4 >= 4.0.1)

set_error_handler - устанавливает пользовательский обработчик ошибок.

Описание

string set_error_handler (string error_handler)

Устанавливает пользовательскую функцию (error_handler) для обработки ошибок в скрипте. Возвращает ранее определённый обработчик ошибок (если имеется), FALSE при ошибке. Эта функция может использоваться для определения вашего собственного способа обработки ошибок на этапе прогона, например, в приложениях, в которых вам нужно зачистить данные/файлы при возникновении критических ошибок, или если вам нужно переключить ошибку при определённых условиях (использую trigger_error()).

Пользовательская функция должна принимать 2 параметра: error-код и строку с описанием ошибки. Начиная с PHP 4.0.2, предоставляются дополнительные 3 параметра: имя файла, в котором появилась ошибка, номер строчки, в которой появилась ошибка, и контекст, в котором появилась ошибка (массив, указывающий на активную таблицу символов в точке возникновения ошибки).

Примечание: следующие типы ошибок не могут быть обработаны пользовательской функцией: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR и E_COMPILE_WARNING.

Следующий пример показывает обработку внутренних исключений путём переключения ошибок и обработки их пользовательской функцией:
Пример 1. Обработка ошибок с помощью set_error_handler() и trigger_error()
<?php // переопределить константы пользовательских ошибок - только PHP 
4 define (FATAL,E_USER_ERROR); define (ERROR,E_USER_WARNING); define (WARNING,E_USER_NOTICE); 
// установить уровень серьёзности ошибок для данного скрипта error_reporting (FATAL 
| ERROR | WARNING); // функция обработчика ошибок function myErrorHandler ($errno, 
$errstr, $errfile, $errline) { switch ($errno) { case FATAL: echo "<b>FATAL</b> 
[$errno] $errstr<br>\n"; echo " Fatal error in line ".$errline." of file 
".$errfile; echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n"; echo "Aborting...<br>\n"; 
exit 1; break; case ERROR: echo "<b>ERROR</b> [$errno] $errstr<br>\n"; 
break; case WARNING: echo "<b>WARNING</b> [$errno] $errstr<br>\n"; 
break; default: echo "Unkown error type: [$errno] $errstr<br>\n"; break; 
} } // функция для проверки обработки ошибок function scale_by_log ($vect, $scale) 
{ if ( !is_numeric($scale) || $scale <= 0 ) trigger_error("log(x) for x <= 
0 is undefined, you used: scale = $scale", FATAL); if (!is_array($vect)) { trigger_error("Incorrect 
input vector, array of values expected", ERROR); return null; } for ($i=0; $i<count($vect); 
$i++) { if (!is_numeric($vect[$i])) trigger_error("Value at position $i is not 
a number, using 0 (zero)", WARNING); $temp[$i] = log($scale) * $vect[$i]; } return 
$temp; } // установить в пользовательский обработчик ошибок $old_error_handler 
= set_error_handler("myErrorHandler"); // переключить некоторые ошибки; сначала 
определить смешанный // массив с нецифровыми элементами echo "vector a\n"; $a 
= array(2,3,"foo",5.5,43.3,21.11); print_r($a); // теперь сгенерировать второй 
массив, генерируя предупреждение echo "----\nvector b - a warning (b = log(PI) 
* a)\n"; $b = scale_by_log($a, M_PI); print_r($b); // это проблема, мы передаём 
строку вместо массива echo "----\nvector c - an error\n"; $c = scale_by_log("not 
array",2.3); var_dump($c); // это критическая ошибка, log нуль или отрицательное 
число не определено echo "----\nvector d - fatal error\n"; $d = scale_by_log($a, 
-2.5); ?>

А когда вы запустите это скрипт-сэмпл:

vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 
5.5 [4] => 43.3 [5] => 21.11 ) ---- vector b - a warning (b = log(PI) 
* a) <b>WARNING</b> [1024] Value at position 2 is not a number, 
using 0 (zero)<br> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 
[2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 
24.165247890281 ) ---- vector c - an error <b>ERROR</b> [512] 
Incorrect input vector, array of values expected<br> NULL ---- vector 
d - fatal error <b>FATAL</b> [256] log(x) for x <= 0 is undefined, 
you used: scale = -2.5<br> Fatal error in line 36 of file trigger_error.php, 
PHP 4.0.2 (Linux)<br> Aborting...<br>

Важно помнить, что стандартный обработчик ошибок РНР полностью игнорируется. Установки error_reporting() не будут иметь эффекта, и ваш обработчик будет вызываться независимо - однако вы можете читать текущее значение из error_reporting и поступать соответственно. Особенно важно то, что это значение будет 0, если оператор, вызвавший ошибку, имел префикс @.

Отметьте также, что вы отвечаете за die(), если это необходимо. Если возвращает функция обработки ошибок, выполнение скрипта будет продолжено со следующего оператора после оператора, вызвавшего ошибку.

См. также error_reporting(), restore_error_handler(), trigger_error(), user_error().


Назад Оглавление Вперёд
restore_error_handler Вверх trigger_error

Повторение

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

Если патэрн начинается с .* или с .{0,} и установлена опция PCRE_DOTALL (эквивалентная Perl'овской /s), разрешая, таким образом совпадение . с символами новой строки, то патэрн неявно заякоривается, поскольку всё, что идёт следом, будет испытываться относительно каждой символьной позиции в строке-субъекте, поэтому после первой нет другой позиции для возобновления попыток найти полное совпадение.
PCRE рассматривает такой патэрн так, как если бы ему предшествовало \A. Когда известно, что строка-субъект не содержит символов новой строки, предпочтительнее установить PCRE_DOTALL, если патэрн начинается с  .*, чтобы получить эту оптимизацию, или, альтернативно, использовать ^ для явного обозначения заякоривания.

Когда захватывающий субпатэрн повторяется, захваченным значением является подстрока, которая совпадает с последней итерацией. Например, после того как

(tweedle[dume]{3}\s*)+

совпадает с "tweedledum tweedledee", значением захваченной подстроки будет "tweedledee". Однако, если имеются вложенные захватывающие субпатэрны, соответствующие захваченные значения могут быть установлены в предыдущих итерациях. Например, после того как

/(a|(b))+/

совпадёт с "aba", значением второй захваченной подстроки будет "b".