English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de PHP

Tutorial avanzado de PHP

PHP & MySQL

Manual de Referencia PHP

Manejo de errores en PHP

En este tutorial, aprenderá a usar las funciones de manejo de errores de PHP para manejar situaciones de error de manera elegante.

Manejo de errores

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.

Entender los niveles de error

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 errorValorDescription
E_ERROR1

Error fatal en tiempo de ejecución, no recuperable. La ejecución del script se detendrá inmediatamente.

E_WARNING2

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_NOTICE8

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_ERROR256

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_WARNING512Advertencia 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_NOTICE1024

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_STRICT2048

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_ALL8191

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:

Manejo básico de errores con la función die()

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.

Crear un programa de manejo de errores personalizado

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:

ParametersDescription
Required - The following parameters are required
errnoSpecify the error level as an integer. This corresponds to the appropriate error level constants (E_ERROR, E_WARNING, etc.)
errstrSpecify the error message as a string
Optional - The following parameters are optional
errfileSpecify the filename of the script file where the error occurred as a string
errlineSpecify the line number where the error occurred as a string
errcontextSpecify 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);
?>

Error logging

Record error messages in a text file

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.";
?>

Send error messages via email

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á.";
?>

Generar error

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.