PHP Manejo de errores
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.
Manejo de errores en PHP
Al crear scripts y aplicaciones web, el manejo de errores es una parte importante. Si su código carece de codificación de detección de errores, el programa se verá poco profesional y también abrirá la puerta a riesgos de seguridad.
Este tutorial presenta algunos de los métodos más importantes de detección de errores en PHP.
Le explicaremos diferentes métodos de manejo de errores:
- La declaración simple "die()"
- Errores personalizados y disparadores de errores
- Reporte de errores
Manejo básico de errores: usando la función die()
El primer ejemplo muestra un script simple que abre un archivo de texto:
<?php
$file=fopen("welcome.txt","r");
?>
Si el archivo no existe, obtendrá un error similar a este:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/ejemplo/test/test.php on line 2
Para evitar que el usuario reciba mensajes de error como el anterior, verificamos si el archivo existe antes de acceder a él:
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
Ahora, si el archivo no existe, obtendrá un mensaje de error similar a este:
El archivo no existe
En comparación con el código anterior, este código es más eficaz, ya que utiliza un mecanismo simple de manejo de errores que detiene el script después del error.
Sin embargo, detener el script simplemente no siempre es la forma adecuada. Investiguemos las funciones alternativas de PHP para manejar errores.
Crear un manejador de errores personalizado
Crear un manejador de errores personalizado es muy simple. Simplemente creamos una función especial que se puede llamar cuando ocurre un error en PHP.
Esta función debe poder manejar al menos dos parámetros (error level y error message), pero puede aceptar hasta cinco parámetros (opcionales: file, line-number y error context):
Sintaxis
error_function(error_level,error_message, error_file,error_line,error_context)
| Parámetro | Descripción |
|---|---|
| error_level | Obligatorio. Especifica el nivel de reporte de errores para el error definido por el usuario. Debe ser un número. Consulte la siguiente tabla: Niveles de reporte de errores. |
| error_message | Obligatorio. Especifica el mensaje de error para el error definido por el usuario. |
| error_file | Opcional. Especifica el nombre del archivo donde ocurrió el error. |
| error_line | Opcional. Especifica el número de línea donde ocurrió el error. |
| error_context | Opcional. Especifica una matriz que contiene cada variable en uso cuando ocurrió el error y sus valores. |
Niveles de reporte de errores
Estos niveles de reporte de errores son los diferentes tipos de errores que maneja el manejador de errores definido por el usuario:
| Valor | Constante | Descripción |
|---|---|---|
| 2 | E_WARNING | Error de tiempo de ejecución no fatal. No detiene la ejecución del script. |
| 8 | E_NOTICE | Aviso de tiempo de ejecución. Ocurre cuando el script detecta que posiblemente hay un error, pero también puede ocurrir cuando el script se ejecuta normalmente. |
| 256 | E_USER_ERROR | Error fatal generado por el usuario. Es similar al E_ERROR establecido por el programador usando la función de PHP trigger_error(). |
| 512 | E_USER_WARNING | Advertencia no fatal generada por el usuario. Es similar al E_WARNING establecido por el programador usando la función de PHP trigger_error(). |
| 1024 | E_USER_NOTICE | Aviso generado por el usuario. Es similar al E_NOTICE establecido por el programador usando la función de PHP trigger_error(). |
| 4096 | E_RECOVERABLE_ERROR | Error fatal capturable. Similar a E_ERROR, pero puede ser capturado por un manejador definido por el usuario. (Consulte set_error_handler()). |
| 8191 | E_ALL | Todos los errores y advertencias. (En PHP 5.4, E_STRICT pasó a ser parte de E_ALL). |
Ahora, creemos una función para manejar errores:
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
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 muestra el nivel de error y el mensaje, y termina el script.
Ahora que hemos creado una función de manejo de errores, necesitamos determinar cuándo se debe activar esta función.
Configurar el manejador de errores
El manejador de errores predeterminado de PHP es el manejador de errores integrado. Vamos a convertir la función anterior en el manejador de errores predeterminado durante la ejecución del script.
Se puede modificar el manejador 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, vamos a usar nuestro manejador de errores personalizado para todos los errores:
set_error_handler("customError");
Dado que queremos que nuestra función personalizada maneje todos los errores, set_error_handler() solo necesita un parámetro; se puede agregar un segundo parámetro para especificar el nivel de error.
Ejemplo
Pruebe este manejador de errores intentando mostrar una variable que no existe:
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
?>
La salida del código anterior es la siguiente:
Error: [8] Undefined variable: test
Disparar errores
En las partes del script donde el usuario ingresa datos, es útil disparar un error cuando la entrada del usuario no es válida. En PHP, esta tarea se realiza con la función trigger_error().
Ejemplo
En este ejemplo, si la variable "test" es mayor que "1", se producirá un error:
<?php
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1");
}
?>
La salida del código anterior es la siguiente:
Notice: 变量值必须小于等于 1 in /www/test/ejemplo.php on line 5
Puede disparar errores en cualquier lugar del script; mediante el segundo parámetro agregado, puede especificar el tipo de error que se dispara.
Tipos de error posibles:
- E_USER_ERROR: error de tiempo de ejecución fatal generado por el usuario. El error no se puede recuperar. La ejecución del script se interrumpe.
- 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. Aviso de tiempo de ejecución generado por el usuario. Ocurre cuando el script detecta que posiblemente hay un error, pero también puede ocurrir cuando el script se ejecuta normalmente.
Ejemplo
En este ejemplo, si la variable "test" es mayor que "1", se produce un error E_USER_WARNING. Si ocurre E_USER_WARNING, usaremos nuestro manejador de errores personalizado y terminaremos el script:
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>
La salida del código anterior es la siguiente:
Error: [512] 变量值必须小于等于 1 脚本结束
Ahora que hemos aprendido cómo crear nuestros propios errores y cómo dispararlos, a continuación estudiaremos el registro de errores.
Registro de errores
De forma predeterminada, según la configuración de error_log en php.ini, PHP envía los registros de error al sistema de registro del servidor o a un archivo. Mediante el uso de la función error_log(), puede enviar registros de error a un archivo específico o a un destino remoto.
Enviarse mensajes de error por correo electrónico es una buena manera de recibir notificaciones de errores específicos.
Enviar mensajes de error por correo electrónico
En el siguiente ejemplo, si ocurre un error específico, enviaremos un correo electrónico con el mensaje de error y terminaremos el script:
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "已通知网站管理员";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>
La salida del código anterior es la siguiente:
Error: [512] 变量值必须小于等于 1 已通知网站管理员
El correo recibido del código anterior es el siguiente:
Error: [512] 变量值必须小于等于 1
Este método no es adecuado para todos los errores. Los errores habituales deben registrarse en el servidor utilizando el sistema de registro predeterminado de PHP.
Otras extensiones