En PHP, el manejo de errores predeterminado es simple. Se envía un mensaje de error al navegador con el nombre del archivo, el número de línea y un mensaje que describe el error.
El manejo de errores es una parte importante al crear scripts y aplicaciones web. Si su código carece de codificación de detección de errores, el programa parecerá poco profesional y abrirá la puerta a riesgos de seguridad.
Este tutorial presenta algunos de los métodos de detección de errores más importantes en PHP.
Le explicaremos diferentes métodos de manejo de errores:
Declaración simple "morir()"
Errores personalizados y desencadenantes de errores
informe de errores
El primer ejemplo muestra un script simple que abre un archivo de texto:
<?php$file=fopen("bienvenido.txt","r");?>
Si el archivo no existe, obtendrá un error como este:
Advertencia: fopen(welcome.txt) [function.fopen]: no se pudo abrir la secuencia: no existe tal archivo o directorio en /www/codercto/test/test.php en la línea 2
Para evitar que los usuarios reciban mensajes de error como el anterior, verificamos si el archivo existe antes de acceder a él:
<?phpif(!file_exists("bienvenido.txt")){ die("El archivo no existe");}else{ $file=fopen("bienvenido.txt","r");}?>
Ahora, si el archivo no existe, recibirá un mensaje de error como este:
El archivo no existe
El código anterior es más eficiente que el código anterior porque utiliza un mecanismo simple de manejo de errores para finalizar el script después de un error.
Sin embargo, simplemente finalizar el script no siempre es apropiado. Examinemos funciones PHP alternativas para manejar errores.
Crear un controlador de errores personalizado es muy sencillo. Simplemente creamos una función dedicada que se puede llamar cuando ocurre un error en PHP.
La función debe poder manejar al menos dos parámetros (nivel de error y mensaje de error), pero puede aceptar hasta cinco parámetros (opcional: archivo, número de línea y contexto de error):
función_error(nivel_error,mensaje_error,archivo_error,línea_error,contexto_error)
parámetro | describir |
---|---|
nivel_error | Requerido. Especifica el nivel de informe de errores para errores definidos por el usuario. Debe ser un número. Consulte la siguiente tabla: Niveles de informe de errores. |
mensaje_error | Requerido. Especifica mensajes de error para errores definidos por el usuario. |
archivo_error | Opcional. Especifica el nombre del archivo donde ocurrió el error. |
línea_error | Opcional. Especifica el número de línea donde ocurrió el error. |
contexto_error | Opcional. Especifica una matriz que contiene cada variable en uso cuando ocurrió el error y sus valores. |
Estos niveles de informe de errores son diferentes tipos de errores manejados por controladores de errores definidos por el usuario:
valor | constante | describir |
---|---|---|
2 | E_ADVERTENCIA | Error de tiempo de ejecución no fatal. No pausar la ejecución del script. |
8 | E_AVISO | notificaciones en tiempo de ejecución. Ocurre cuando el script encuentra un posible error, pero también puede ocurrir cuando el script se ejecuta normalmente. |
256 | E_USER_ERROR | Error fatal generado por el usuario. Esto es similar a E_ERROR establecido por el programador usando la función PHP trigger_error(). |
512 | E_USER_WARNING | Advertencia no fatal generada por el usuario. Esto es similar al E_WARNING establecido por el programador usando la función PHP trigger_error(). |
1024 | E_USER_NOTICE | Notificaciones generadas por el usuario. Esto es similar a E_NOTICE configurado por el programador usando la función PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Errores fatales atrapables. Como E_ERROR, pero puede ser detectado por controladores definidos por el usuario. (Ver set_error_handler()) |
8191 | E_ALL | Todos los errores y advertencias. (En PHP 5.4, E_STRICT pasa a formar parte de E_ALL) |
Ahora, creemos una función que maneje errores:
function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Fin del script";}
El código anterior es una función simple de manejo de errores. Cuando se activa, obtiene el nivel de error y el mensaje de error. Luego imprime el nivel de error y el mensaje y finaliza el script.
Ahora que hemos creado una función de manejo de errores, debemos determinar cuándo activarla.
El controlador de errores predeterminado de PHP es el controlador de errores integrado. Transformaremos la función anterior en el controlador de errores predeterminado cuando se ejecute el script.
Los controladores de errores se pueden modificar para que se apliquen solo a ciertos errores, de modo que el script pueda manejar diferentes errores de manera diferente. Sin embargo, en este caso usaremos nuestro controlador de errores personalizado para todos los errores:
set_error_handler("Error personalizado");
Como queremos que nuestra función personalizada maneje todos los errores, set_error_handler() requiere solo un argumento y se puede agregar un segundo argumento para especificar el nivel de error.
Pruebe este controlador de errores intentando imprimir una variable que no existe:
<?php// Función de manejo de errores function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr";}// Establecer la función de manejo de errores set_error_handler("customError") ;//Error de activación echo($prueba);?>
La salida del código anterior se ve así:
Error: [8] Variable no definida: prueba
Cuando el usuario ingresa datos en un script, es útil generar un error cuando la entrada del usuario no es válida. En PHP, esta tarea se realiza mediante la función trigger_error().
En este ejemplo, si la variable "prueba" es mayor que "1", se produce un error:
<?php$test=2;if ($test>1){ trigger_error("El valor de la variable debe ser menor o igual a 1");}?>
La salida del código anterior se ve así:
Aviso: el valor de la variable debe ser menor o igual a 1 pulgada /www/test/codercto.php en la línea 5
Puede desencadenar un error en cualquier parte del script y, al agregar un segundo parámetro, puede especificar el nivel de error que se desencadena.
Posibles tipos de errores:
E_USER_ERROR: error grave en tiempo de ejecución generado por el usuario. El error no se puede recuperar. La ejecución del script fue interrumpida.
E_USER_WARNING: advertencia de tiempo de ejecución no fatal generada por el usuario. La ejecución del script no se interrumpe.
E_USER_NOTICE: predeterminado. Notificaciones en tiempo de ejecución generadas por el usuario. Ocurre cuando el script encuentra un posible error, pero también puede ocurrir cuando el script se ejecuta normalmente.
En este ejemplo, si la variable "prueba" es mayor que "1", se produce un error E_USER_WARNING. Si ocurre E_USER_WARNING, usaremos nuestro controlador de errores personalizado y finalizaremos el script:
<?php// Función de manejo de errores customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>" echo "Fin del script"; }//Establecer la función de manejo de errores set_error_handler("customError",E_USER_WARNING);//Error de activación $test=2;if ($test>1){ trigger_error("El valor de la variable debe ser menor o igual a 1",E_USER_WARNING);}?>
La salida del código anterior se ve así:
Error: [512] El valor de la variable debe ser menor o igual a 1. Fin del script
Ahora que hemos aprendido cómo crear nuestros propios errores y cómo activarlos, veamos el registro de errores.
De forma predeterminada, PHP envía registros de errores al sistema o archivo de registro del servidor, dependiendo de la configuración de error_log en php.ini. Al utilizar la función error_log(), puede enviar registros de errores a un archivo específico o a un destino remoto.
Enviarse un mensaje de error por correo electrónico es una buena manera de recibir una notificación sobre un error específico.
En el siguiente ejemplo, si ocurre un error específico, enviaremos un correo electrónico con un mensaje de error y finalizaremos el script:
<?php// Función de manejo de errores customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>" echo "El administrador del sitio web ha sido notificado"; ("Error: [$errno] $errstr",1, "[email protected]","De: [email protected]");}// Establecer la función de manejo de errores set_error_handler("customError",E_USER_WARNING); // Error de activación $test=2;if ($test>1){ trigger_error("El valor de la variable debe ser menor o igual a 1",E_USER_WARNING);} ?>
La salida del código anterior se ve así:
Error: [512] El valor de la variable debe ser menor o igual a 1. El administrador del sitio web ha sido notificado
El correo electrónico recibido del código anterior se ve así:
Error: [512] El valor de la variable debe ser menor o igual a 1
Este método no es adecuado para todos los errores. Los errores generales deben registrarse en el servidor utilizando el sistema de registro PHP predeterminado.