set_error_handler PDF Печать E-mail

(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(), если это необходимо. Если возвращает функция обработки ошибок, выполнение скрипта будет продолжено со следующего оператора после оператора, вызвавшего ошибку.

По материалам сайта: http://www.php.su/