Administrar los errores en un script PHP
Información general
Un error en un script PHP se puede manifestar de dos maneras, posiblemente al mismo tiempo:
-
por un valor de retorno determinado de la función PHP en la que se encuentra el error;
-
por un mensaje enviado directamente a la página.
Ejemplos
Función |
Comportamiento en caso de error |
require |
Si el archivo parametrado no existe, se muestra un mensaje, pero la función no devuelve ningún código especial. |
mysqli_query |
Si el servidor MySQL devuelve un error en la ejecución de la consulta, no aparece ningún mensaje, pero la función devuelve FALSE (la naturaleza del error se puede recuperar por otras funciones). |
oci_execute |
Si el servidor Oracle devuelve un error en la ejecución de la consulta, aparece un mensaje y la función devuelve FALSE (la naturaleza del error se puede recuperar por otras funciones). |
Por tanto, gestionar los errores en un script PHP consiste, en general, en establecer un mecanismo para detectar la generación de un error con el fin de que este muestre un mensaje en lugar del mensaje que muestra PHP directamente.
Mensajes de error de PHP
Los mensajes de error (o avisos) que muestra PHP tienen un nivel correspondiente a su gravedad:
Valor |
Constante asociada |
Descripción |
1 |
E_ERROR |
Error fatal de ejecución (mensaje "fatal error:..."). El script no se ejecuta. Ejemplos: llamada a una función que no existe, archivo mencionado en la instrucción require que no existe. |
2 |
E_WARNING |
Alerta de ejecución (mensaje "warning:..."). El script continúa. Ejemplos: intento de apertura (con fopen) de un archivo no existente, apertura de una conexión MySQL sin éxito... En general, si el script continúa, provoca otros mensajes del mismo tipo. |
4 |
E_PARSE |
Error de compilación ("Parse error:..."). El script no se ejecuta. Ejemplos: olvido de un punto y coma, un paréntesis de cierre... |
8 |
E_NOTICE |
Advertencia durante la ejecución (mensaje "Notice:..."). Por defecto, PHP está configurado para no mostrar estas advertencias. El script continúa. Ejemplo: utilización de una variable no inicializada. |
16 |
E_CORE_ERROR |
Error grave al inicializar PHP. |
32 |
E_CORE_WARNING |
Alerta durante la inicialización de PHP. |
64 |
E_COMPILE_ERROR |
Error grave durante la compilación. |
128 |
E_COMPILE_WARNING |
Alerta durante la compilación. |
256 |
E_USER_ERROR |
Error generado por el desarrollador. |
512 |
E_USER_WARNING |
Alerta generada por el desarrollador. |
1024 |
E_USER_NOTICE |
Advertencia generada por el desarrollador. |
2048 |
E_STRICT |
Consejos durante la ejecución. Permite a PHP sugerir cambios para mejorar la portabilidad del código, especialmente para las futuras versiones (con una función obsoleta... |
Las funciones de gestión de errores
PHP ofrece varias funciones que permiten gestionar correctamente los errores en un script:
Nombre |
Función |
error_reporting |
Define los niveles de errores que se muestran por PHP. |
error_log |
Envía un mensaje de error a un destino (archivo, por ejemplo). |
set_error_handler |
Especifica el nombre de una función de usuario que se utiliza como controlador de error. |
set_exception_handler |
Indica el nombre de una función de usuario que se utilizará como controlador de excepción. |
restore_exception_handler |
Reactiva el antiguo controlador de excepción. |
restore_error_handler |
Restaura el controlador de error antiguo. |
trigger_error user_error |
Genera un error definido por el desarrollador (user_error es un alias de trigger_error). |
error_get_last |
Devuelve información sobre el último error encontrado en el script. |
error_clear_last |
Borra el último error encontrado en el script. |
También existen dos funciones, debug_backtrace y debug_print_backtrace que permiten obtener información útil para la puesta a punto (contexto de ejecución y pila de llamadas); para saber más sobre estas dos funciones, vaya a la documentación.
Además, el operador @, colocado antes del nombre de una función, permite eliminar la visualización de los mensajes generados, en caso de error, en la función.
Ejemplo
<?php
$archivo = @fopen('/tmp/infos.txt','r');
$texto = @fread($archivo,100);
@fclose($archivo);
?>
Al ejecutar este script, no aparece ningún mensaje, ya que el archivo solicitado no existe.
Si el error provoca una parada del script, el uso del operador @ no cambia nada; la página mostrada está vacía o incompleta y no se muestra ningún mensaje al usuario. Por tanto, es necesario probar el resultado de las funciones, o usar un controlador de error para controlar el flujo del programa y realizar los procesamientos necesarios.
error_reporting
La función error_reporting permite definir los niveles de error para los cuales el programa permite a PHP mostrar los mensajes.
Sintaxis
entero error_reporting([entero niveles])
niveles |
Niveles de error mostrados por PHP, expresados en forma de una suma de los valores asignados a cada nivel. |
La función error_reporting devuelve el valor anterior. Llamada sin parámetros, esta función...
Ejercicio 7: gestionar los errores
En este ejercicio, vamos a aprender a gestionar los errores en un script PHP.
Etapa 1
Vamos a analizar lo que pasa si un script quiere leer el contenido de un archivo que no existe.
Indicaciones:
-
En un nuevo directorio, copie el script inicio.php desarrollado en el ejercicio 4 (sin copiar el archivo autores.txt).
-
Llame a este script en su navegador.
Resultado esperado
Warning: file(autores.txt): failed to open stream: No such file or
directory in /app/scripts/ejercicios/07/inicio.php on line 3
Warning: Invalid argument supplied for foreach() in
/app/scripts/ejercicios/07/inicio.php on line 22
Autores |
En el estado actual de las cosas, si el archivo autores.txt no existe, se producen dos errores y se muestran en la página, uno durante la lectura del archivo y otro durante el recorrido de la tabla (como consecuencia del error inicial, la variable $autores contiene el valor FALSE).
Etapa 2
Queremos mejorar el comportamiento de nuestro script en caso de error, controlando la visualización del mensaje de error.
Indicaciones:
-
Al inicio del script, inserte una instrucción que desactive la visualización de los errores de PHP.
-
Pruebe el resultado de la llamada a la función file() y asigne una variable $ok que indique si la lectura del archivo ha terminado con éxito o no.
-
En la página, en caso de éxito...