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()