Manejo de errores en PHP
- Página anterior Correo electrónico seguro de PHP
- Página siguiente Excepciones de PHP
En PHP, el manejo de errores por defecto es simple. Un mensaje se envía al navegador, que contiene el nombre del archivo, el número de línea y un mensaje que describe el error.
Manejo de errores en PHP
Al crear scripts y aplicaciones web, el manejo de errores es una parte importante. Si su código falta de código de detección de errores, el programa parece poco profesional y abre puertas a riesgos de seguridad.
Este tutorial introduce algunos de los métodos de detección de errores más importantes en PHP.
Le explicaremos diferentes métodos de manejo de errores:
- Sentencia simple "die()"
- Errores personalizados y desencadenadores de errores
- Reporte de errores
Manejo básico de errores: uso de la función die()
El primer ejemplo muestra un script simple para abrir un archivo de texto:
<?php $file=fopen("welcome.txt","r"); ?>
Si el archivo no existe, obtendrá un error similar a este:
Advertencia: fopen(welcome.txt) [función.fopen]: no se pudo abrir el flujo: No se encontró archivo o directorio en C:\webfolder\test.php en la línea 2
Para evitar que el usuario obtenga un mensaje de error similar al anterior, verificamos si el archivo existe antes de acceder al archivo:
<?php if(!file_exists("welcome.txt")) { die("Archivo no encontrado"); } else { $file=fopen("welcome.txt","r"); } ?>
Ahora, si el archivo no existe, obtendrá un mensaje de error similar a este:
Archivo no encontrado
En comparación con el código anterior, el código superior es más efectivo, ya que utiliza un mecanismo simple de manejo de errores para detener el script después del error.
Sin embargo, no siempre es apropiado detener simplemente el script. Vamos a estudiar las funciones alternativas de PHP para manejar errores.
Crear procesador de errores personalizado
Crear un procesador de errores personalizado es muy simple. Simplemente creamos una función dedicada que se puede llamar cuando ocurre un error en PHP.
Esta función debe poder manejar al menos dos parámetros (nivel de error y mensaje de error), pero puede aceptar hasta cinco parámetros (opcionalmente: archivo, número de línea y contexto de error):
Sintaxis
error_function(error_level, error_message, error_file, error_line, error_context)
Parámetros | Descripción |
---|---|
error_level | Necesario. Define el nivel de reporte de errores para los errores definidos por el usuario. Debe ser un valor numérico. Consulte la tabla siguiente: Nivel de reporte de errores. |
error_message | Necesario. Define el mensaje de error para los errores definidos por el usuario. |
error_file | Opcional. Especifica el nombre del archivo donde se produjo el error. |
error_line | Opcional. Especifica el número de línea donde se produjo el error. |
error_context | Opcional. Especifica un array que contiene cada variable en uso y sus valores cuando ocurre un error. |
Nivel de reporte de errores
Estos niveles de reporte de errores son diferentes tipos de errores que el programa de manejo de errores está destinado a manejar:
Valor | Constante | Descripción |
---|---|---|
2 | E_WARNING | Errores en tiempo de ejecución no fatales. No detiene la ejecución del script. |
8 | E_NOTICE | Notificación en tiempo de ejecución. El script detecta que puede ocurrir un error, pero también puede ocurrir durante la ejecución normal del script. |
256 | E_USER_ERROR | Errores generados por el usuario fatales. Similar a E_ERROR configurado por el programador utilizando la función PHP trigger_error(). |
512 | E_USER_WARNING | Advertencias generadas por el usuario no fatales. Similar a E_WARNING configurado por el programador utilizando la función PHP trigger_error(). |
1024 | E_USER_NOTICE | Notificaciones generadas por el usuario. Similar a E_NOTICE configurado por el programador utilizando la función PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Errores fatales capturables. Similares a E_ERROR, pero pueden ser capturados por el programa de manejo de errores definido por el usuario. (Ver set_error_handler()) |
8191 | E_ALL | Todos los errores y advertencias, excepto el nivel E_STRICT. (En PHP 6.0, E_STRICT es parte de E_ALL) |
Ahora, creemos una función para manejar errores:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Finalización de Script"; die(); }
El código anterior es una función de manejo de errores simple. Cuando se activa, obtiene el nivel de error y el mensaje de error. Luego, muestra el nivel de error y el mensaje y termina el script.
Ahora que ya hemos creado una función de manejo de errores, necesitamos determinar cuándo se activará esta función.
Establecer Gestor de Error
El programa de manejo de errores predeterminado de PHP es el programa de manejo de errores integrado. Queremos transformar la función anterior en el programa de manejo de errores predeterminado durante la ejecución del script.
Se puede modificar el programa de manejo de errores para que solo se aplique a ciertos errores, de modo que el script pueda manejar diferentes errores de diferentes maneras. Sin embargo, en este ejemplo, planeamos usar nuestro programa de manejo de errores personalizado para todos los errores:
set_error_handler("customError");
Debido a que queremos que nuestra función personalizada maneje todos los errores, set_error_handler() solo necesita un parámetro, pero se puede agregar un segundo parámetro para especificar el nivel de error.
Ejemplo
Para probar este gestor de errores, intente imprimir una variable inexistente:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
La salida del código debe ser similar a esto:
Error: [8] Variable no definida: test
Activar errores
En el lugar de entrada de datos del usuario en el script, es muy útil activar errores cuando los datos del usuario son inválidos. En PHP, esta tarea la realiza trigger_error().
Ejemplo
En este ejemplo, si el variable "test" es mayor que "1", se producirá un error:
<?php $test=2; if ($test>1) { trigger_error("El valor debe ser 1 o inferior"); } ?>
La salida del código debe ser similar a esto:
Aviso: El valor debe ser 1 o inferior en C:\webfolder\test.php en la línea 6
Puede activar errores en cualquier lugar del script, mediante el segundo parámetro, puede especificar el nivel de error activado.
Tipos de errores posibles:
- E_USER_ERROR - Error de tiempo de ejecución generado por el usuario fatal. El error no se puede recuperar. La ejecución del script se interrumpe.
- E_USER_WARNING - Advertencia de tiempo de ejecución generada por el usuario no fatal. La ejecución del script no se interrumpe.
- E_USER_NOTICE - Por defecto. Notificaciones de tiempo de ejecución generadas por el usuario. El script detecta errores posibles, también pueden ocurrir cuando el script se ejecuta correctamente.
Ejemplo
En este ejemplo, si el variable "test" es mayor que "1", se produce un error E_USER_WARNING. Si se produce E_USER_WARNING, utilizaremos nuestro programa de manejo de errores personalizado y finalizaremos el script:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Finalización de Script"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("El valor debe ser 1 o inferior",E_USER_WARNING); } ?>
La salida del código debe ser similar a esto:
Error: [512] El valor debe ser 1 o inferior Finalización de Script
Ahora que hemos aprendido a crear nuestros propios errores y cómo activarlos, investiguemos el registro de errores.
Registro de errores
Por defecto, según la configuración de error_log en php.ini, PHP envía registros de errores al sistema de registro de errores del servidor o a un archivo. Al usar la función error_log(), puede enviar registros de errores a un archivo o destino remoto especificado.
Enviar un mensaje de error a sí mismo por correo electrónico es una buena manera de obtener notificación de errores específicos.
Enviar un mensaje de error a través de E-Mail
En el siguiente ejemplo, si ocurre un error específico, enviaremos un correo electrónico con el mensaje de error y finalizaremos el script:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("El valor debe ser 1 o inferior",E_USER_WARNING); } ?>
La salida del código debe ser similar a esto:
Error: [512] El valor debe ser 1 o inferior Se ha notificado al administrador del sitio
El correo recibido desde el código es similar a esto:
Error: [512] El valor debe ser 1 o inferior
Este método no es adecuado para todos los errores. Los errores comunes deben registrarse en el sistema de registro predeterminado de PHP en el servidor.
- Página anterior Correo electrónico seguro de PHP
- Página siguiente Excepciones de PHP