set_error_handler

(PHP 4 >= 4.0.1, PHP 5)

set_error_handler --  Establece una función específica para el manejo de errores.

Descripción

string set_error_handler ( string error_handler )

Establece una función definida por el usuario (error_handler) para el manejo de los errores dentro de un script. Devuelve el anterior manejador de errores (si es que existe alguno) o FALSE si se produce un error. Esta función se utiliza para definir un método específico de manejo de los errores que se producen en tiempo de ejecución. Por ejemplo, se puede utilizar en aplicaciones que requieran un tratamiento especial de algunos datos/archivos cuando se produce un error crítico o cuando se lanza un determinado error (utilizando la función trigger_error())

La función que se quiere utilizar para el manejo de errores debe aceptar 2 parámetros: el código de error y una cadena de texto que describe el error producido. A continuación se muestra un ejemplo de uso de excepciones mediante el lanzamiento de errores y su manejo con una función definida por el usuario:

Ejemplo 1. Manejo de errores con las funciones set_error_handler() y trigger_error()

<?php

// Definición de las constantes de error del usuario - solo PHP4
define (FATAL,E_USER_ERROR);
define (ERROR,E_USER_WARNING);
define (WARNING,E_USER_NOTICE);

// Establecer el nivel de errores notificado en este script
error_reporting  (FATAL + ERROR + WARNING);

// Función de manejo de errores
function myErrorHandler ($errno, $errstr) {
    switch (
$errno) {
    case
FATAL:
    echo
"<b>FATAL</b> [$errno] $errstr<br>\n";
    echo
"  Fatal error in line ".__LINE__." of file ".__FILE__;
    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;
    }
}

// Función par probar el manejo de errores
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;
}

// Establecer la función de manejo de errores
$old_error_handler = set_error_handler("myErrorHandler");

// Lanzamiento de algunos errores. En primer lugar se define un array mixto con un elemento no numérico
echo "vector a\n";
$a = array(2,3,"foo",5.5,43.3,21.11);
print_r($a);

// Crear un nuevo array, generando un aviso
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);

// Lo siguiente produce un error, ya que se pasa una cadena de texto en lugar de un array
echo "----\nvector c - an error\n";
$c = scale_by_log("not array",2.3);
var_dump($c);

// A continuación se produce un error crítico, ya que no está definido el logaritmo
// de un número negativo o igual a cero
echo "----\nvector d - fatal error\n";
$d = scale_by_log($a, -2.5);

?>

Cuando se ejecuta el anterior ejemplo, el resultado será similar al siguiente:

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 />

Un aspecto importante a tener en cuenta cuando se utiliza un manejador propio es que el manejador de errores de PHP se deshabilita por completo (de forma temporal). De esta forma, los cambios efectuados con la función error_reporting() no tienen ningún efecto, ya que se utilizará exclusivamente la función manejadora de errores definida por el usuario. No obstante, se puede consultar el valor almacenado en error_reporting y actuar en consecuencia. Además, es necesario tener presente que el valor almacenado en error_reporting será igual a 0 si la sentencia que originó el error tiene como prefijo el operador @ .

Además, la función manejadora de errores deberá hacer uso de la función die() si es necesario. Si la función manejadora de errores deuelve un valor, la ejecución del script continuará en la sentencia siguiente a la que originó el error.

Nota: Si se produce un error antes de que se ejecute el script (por ejemplo cuando se sube un archivo), no se puede utilizar un manejador creado por el usuario, ya que en ese momento aún no ha sido registrado.

Nota: El segundo parámetro error_types se introdujo a partir de PHP 5.

Puede consultar tambié las funciones error_reporting(), restore_error_handler(), trigger_error() y user_error()