English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá a usar las funciones de manejo de errores de PHP para manejar situaciones de error de manera elegante.
A veces, su aplicación puede no funcionar correctamente, lo que lleva a errores. Hay varios motivos que pueden causar errores, como:
El servidor web puede no tener suficiente espacio en disco
El usuario puede haber ingresado un valor no válido en el campo del formulario
El archivo o el registro de la base de datos que intenta acceder puede no existir
La aplicación puede no tener permiso para escribir archivos en el disco
El servicio que la aplicación necesita puede estar temporalmente no disponible
Este tipo de errores se denominan errores de tiempo de ejecución porque ocurren durante la ejecución del script. Diferentes de los errores de sintaxis que deben solucionarse antes de que el script se ejecute.
Las aplicaciones profesionales deben tener la función adecuada para manejar estos errores de tiempo de ejecución. Esto generalmente significa informar claramente y de manera precisa al usuario sobre lo que ha sucedido.
Por lo general, cuando ocurre un problema que impide que el script funcione correctamente, el motor PHP activa un error. Cada error se representa por un valor entero y una constante asociada. A continuación se muestra una lista de algunos niveles de error comunes:
Nivel de error | Valor | Description |
---|---|---|
E_ERROR | 1 | Error fatal en tiempo de ejecución, no recuperable. La ejecución del script se detendrá inmediatamente. |
E_WARNING | 2 | Advertencia en tiempo de ejecución. No es fatal, la mayoría de los errores pertenecen a esta categoría. La ejecución del script no se detendrá. |
E_NOTICE | 8 | Notificación en tiempo de ejecución. Indica que el script ha encontrado una situación que podría generar un error, aunque también podría ocurrir durante la ejecución normal del script. |
E_USER_ERROR | 256 | Mensaje de error fatal generado por el usuario. Es similar a E_ERROR, pero se genera mediante la función trigger_error() del script PHP en lugar del motor PHP. |
E_USER_WARNING | 512 | Advertencia generada por el usuario no fatal. Es similar a E_WARNING, pero se genera mediante la función trigger_error() del script PHP en lugar del motor PHP. |
E_USER_NOTICE | 1024 | Mensaje de notificación generado por el usuario. Es similar a E_NOTICE, pero se genera mediante la función trigger_error() del script PHP en lugar del motor PHP. |
E_STRICT | 2048 | En términos estrictos, no es un error, pero PHP activa el error siempre que encuentra código que pueda causar problemas o incompatibilidad hacia adelante. |
E_ALL | 8191 | Todos los errores y advertencias, PHP 5.4.0 excepto E_STRICT. |
Para obtener más niveles de errores, consulteNiveles de errores PHPde referencia.
Cada vez que el script PHP encuentra un problema, el motor PHP desencadena un error, pero también puede desencadenar errores usted mismo para generar mensajes de error más amigables para el usuario. De esta manera, puede hacer que la aplicación sea más compleja. A continuación, se describen algunos métodos comunes utilizados para manejar errores en PHP:
Considere el siguiente ejemplo, que solo intenta abrir un archivo de texto en modo de solo lectura.
<?php //Intentar abrir un archivo inexistente $file = fopen("sample.txt", "r"); ?>
Si el archivo no existe, puede recibir el siguiente error:
Advertencia: fopen(sample.txt) [función.fopen]: no se pudo abrir el flujo: No se encontró el archivo o directorio en C:\wamp\www\project\test.php en la línea 2
Si seguimos algunos pasos sencillos, podemos evitar que el usuario reciba este mensaje de error.
<?php if(file_exists("sample.txt")){ $file = fopen("sample.txt", "r"); } else { die("Error: El archivo que está intentando acceder no existe."); } ?>
Ahora, si ejecuta el script anterior, obtendrá el siguiente mensaje de error:
Error: El archivo que está intentando acceder no existe.
Como puede ver, al realizar una simple verificación de si el archivo existe antes de intentar acceder a él, podemos generar mensajes de error más significativos para el usuario.
Si no se encuentra el archivo "sample.txt", el función die() utilizada anteriormente solo mostrará el mensaje de error personalizado y terminará el script actual.
Puede crear su propia función de manejo de errores para manejar los errores de tiempo de ejecución generados por el motor PHP. El programa de manejo de errores personalizado le ofrece mayor flexibilidad y mejor control sobre los errores, puede verificar los errores y decidir cómo manejarlos, puede mostrar un mensaje al usuario, registrar el error en un archivo o base de datos o enviarlo por correo electrónico, intentar solucionar el problema y continuar, salir de la ejecución del script o ignorar completamente el error.
La función de manejo de errores personalizada debe poder manejar al menos dos parámetros (errno y errstr), pero puede optar por aceptar otros tres parámetros (errfile, errline y errcontext), como se describe a continuación:
Parameters | Description |
---|---|
Required - The following parameters are required | |
errno | Specify the error level as an integer. This corresponds to the appropriate error level constants (E_ERROR, E_WARNING, etc.) |
errstr | Specify the error message as a string |
Optional - The following parameters are optional | |
errfile | Specify the filename of the script file where the error occurred as a string |
errline | Specify the line number where the error occurred as a string |
errcontext | Specify an array containing all variables and their values that exist when an error occurs. Useful for debugging |
Here is a simple example of a custom error handling function. No matter how trivial, as soon as an error occurs, this handler customError() is triggered. Then, it outputs the error details to the browser and stops the script execution.
<?php //Error handling function function customError($errno, $errstr){ echo "<b>Error:</<b>[$errno] $errstr"; } ?>
You need to tell PHP to use your custom error handling function-Just call the built-in set_error_handler() function and pass the function name.
<?php //Error handling function function customError($errno, $errstr){ echo "<b>Error:</<b>[$errno] $errstr"; } //Set error handler set_error_handler("customError"); //Generar error echo($test); ?>
You can also record the detailed error information in a log file as follows:
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("calcDivision(): Divisor cannot be zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message .= "Error: [", $errno . ", ", "$errstr in $errfile on line $errline, "; $message .= "Variables:" . print_r($errcontext, true) . "\r\n"; error_log($message, 3, "logs"/app_errors.log die("An issue occurred, please try again."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "This will never be printed."; ?>
You can also use the same error_log() function to send an email with detailed error information.
<?php function calcDivision($dividend, $divisor) { if ($divisor == 0){ trigger_error("calcDivision(): Divisor cannot be zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message .= "Error: [", $errno . ", ", "$errstr in $errfile on line $errline, "; $message .= "Variables:" . print_r($errcontext, true) . "\r\n"; error_log($message, 1, "[email protected]"); die("Ocurrió un problema, por favor inténtelo de nuevo. El informe de error se ha enviado al administrador del sitio."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "Esto nunca se imprimirá."; ?>
Aunque el motor PHP genera errores al encontrar problemas en el script, también puede generarlos usted mismo. Esto puede ayudar a hacer que su aplicación sea más robusta, ya que puede marcar problemas potenciales antes de que se conviertan en errores graves.
Para generar un error desde el interior del script, llame a la función trigger_error() y transmita el mensaje de error a generar:
trigger_error("Ocurrió un problema.");
Considere la función que realiza la división de dos números.
<?php function calcDivision($dividend, $divisor) { return($dividend / $divisor); } //Llamar a la función echo calcDivision(10, 0); ?>
Si se pasa un valor cero como parámetro $divisor, el mensaje de error generado por el motor PHP será similar al siguiente contenido:
Advertencia: División por cero en C:\wamp\www\project\test.php en la línea 3
Este mensaje parece poco contenido. Vea el siguiente ejemplo de generación de errores con la función trigger_error().
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("El divisor no puede ser cero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } //Llamar a la función echo calcDivision(10, 0); ?>
Ahora, el script genera este mensaje de error:
Advertencia: El divisor no puede ser cero en C:\wamp\www\project\error.php en la línea 4
Como puede ver, el mensaje de error generado en el segundo ejemplo es más claro en la explicación del problema en comparación con el ejemplo anterior.