🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PHP 8
  3. Gestionar los errores en un script PHP
Extrait - PHP 8 Desarrolle un sitio web dinámico e interactivo (2a edición)
Extractos del libro
PHP 8 Desarrolle un sitio web dinámico e interactivo (2a edición) Volver a la página de compra del libro

Gestionar 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 determinado devuelto por 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 que se pasa como parámetro 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 se interrumpe.

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:...»). El script continúa.

16

E_CORE_ERROR

Error grave al inicializar PHP. El script no se ejecuta.

32

E_CORE_WARNING

Alerta durante la inicialización de PHP.

64

E_COMPILE_ERROR

Error grave durante la compilación. El script no se ejecuta.

128

E_COMPILE_WARNING

Alerta durante la compilación.

256

E_USER_ERROR

Error generado por el desarrollador. El script se interrumpe.

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.

4096

E_RECOVERABLE_ERROR

Error grave recuperable. Si el desarrollador no gestiona el error (véase más abajo), se detiene el script.

8192

E_DEPRECATED

Alertas durante la ejecución. Permite mostrar alertas sobre el código que utiliza características obsoletas y que podría no funcionar ya en futuras versiones.

16384

E_USER_DEPRECATED

Alerta de obsolescencia generada por el desarrollador.

32767

E_ALL

Todos los errores y advertencias (suma de los niveles anteriores).

La mayoría de los errores fatales (E_ERROR) o recuperables (E_RECOVERABLE_ERROR) se señalan provocando una excepción de tipo...

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, consulte la documentación.

Además, el operador @, colocado antes del nombre de una función, puede usarse para eliminar la visualización de los mensajes generados en la función en caso de error.

Ejemplo

<?php 
$archivo = @fopen('/tmp/infos.txt','r'); 
?> 

Al ejecutar esta instrucción, no aparece ningún mensaje, ya que el archivo solicitado no existe.

images/01RIT8PHP01.png

Desde la versión 8, el operador @ ya no elimina la visualización de los errores fatales que provocan que el script se detenga (E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERRORE_USER_ERROR, E_RECOVERABLE_ERROR). Antes de la versión 8, se detenía la ejecución del script, pero no se mostraba ningún mensaje.

Ejemplo

<?php 
$archivo = @fopen('/tmp/infos.txt','r'); 
$texto = @fread($archivo,100); 
@fclose($archivo); 
?> 

Resultado

Fatal error: Uncaught TypeError: fread(): Argument #1 ($stream) must be of 
type resource, bool given in /app/scripts/index.php:3 Stack trace: #0 
/app/scripts/index.php(3): fread(false, 100) #1 {main} thrown in 
/app/scripts/index.php on line 3 

En este ejemplo, el descriptor de fichero...

Ejercicio 7: gestionar los errores

En este ejercicio, vamos a aprender a gestionar los errores en un script PHP.

Paso 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: foreach() argument must be of type array|object, bool given 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).

Paso 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...