PHP / error – manejo de errores en PHP
En PHP los errores se manejan de una manera algo distinta a otros lenguajes, PHP tratará de seguir adelante con los errores y todo hasta que un error fatal ocurra. Claro está que dará notificaciones de esos errores.
Cada error que genera PHP incluye un tipo. Existe una lista de dichos tipos, junto con una breve descripción de su comportamiento y sus posibles causas. Dejo la lista a continuación:
Valor | Constante | Descripción |
---|---|---|
1 | E_ERROR (integer) |
Errores Fatales en tiempo de ejecución. Éstos indican errores que no se pueden recuperar, tales como un problema de asignación de memoria. La ejecución del script se interrumpe. |
2 | E_WARNING (integer) |
Advertencias en tiempo de ejecución (errores no fatales). La ejecución del script no se interrumpe. |
4 | E_PARSE (integer) |
Errores de análisis en tiempo de compilación. Los errores de análisis deberían ser generados únicamente por el analizador. |
8 | E_NOTICE (integer) |
Avisos en tiempo de ejecución. Indican que el script encontró algo que podría señalar un error, pero que también podría ocurrir en el curso normal al ejecutar un script. |
16 | E_CORE_ERROR (integer) |
Errores fatales que ocurren durante el arranque incial de PHP. Son como unE_ERROR , excepto que son generados por el núcleo de PHP. |
32 | E_CORE_WARNING (integer) |
Advertencias (errores no fatales) que ocurren durante el arranque inicial de PHP. Son como un E_WARNING , excepto que son generados por el núcleo de PHP. |
64 | E_COMPILE_ERROR (integer) |
Errores fatales en tiempo de compilación. Son como un E_ERROR , excepto que son generados por Motor de Script Zend. |
128 | E_COMPILE_WARNING (integer) |
Advertencias en tiempo de compilación (errores no fatales). Son como unE_WARNING , excepto que son generados por Motor de Script Zend. |
256 | E_USER_ERROR (integer) |
Mensaje de error generado por el usuario. Es como un E_ERROR , excepto que es generado por código de PHP mediante el uso de la función de PHP trigger_error(). |
512 | E_USER_WARNING (integer) |
Mensaje de advertencia generado por el usuario. Es como un E_WARNING , excepto que es generado por código de PHP mediante el uso de la función de PHP trigger_error(). |
1024 | E_USER_NOTICE (integer) |
Mensaje de aviso generado por el usuario. Es como un E_NOTICE , excepto que es generado por código de PHP mediante el uso de la función de PHP trigger_error(). |
2048 | E_STRICT (integer) |
Habilítelo para que PHP sugiera cambios en su código, lo que asegurará la mejor interoperabilidad y compatibilidad con versiones posteriores de PHP de su código. |
4096 | E_RECOVERABLE_ERROR (integer) |
Error fatal capturable. Indica que ocurrió un error probablemente peligroso, pero no dejó al Motor en un estado inestable. Si no se captura el error mediante un gestor definido por el usuario (vea también set_error_handler()), la aplicación se abortará como si fuera un E_ERROR . |
8192 | E_DEPRECATED (integer) |
Avisos en tiempo de ejecución. Habilítelo para recibir avisos sobre código que no funcionará en futuras versiones. |
16384 | E_USER_DEPRECATED (integer) |
Mensajes de advertencia generados por el usuario. Son como un E_DEPRECATED , excepto que es generado por código de PHP mediante el uso de la función de PHP trigger_error(). |
32767 | E_ALL (integer) |
Todos los errores y advertencias soportados, excepto del nivel E_STRICT antes de PHP 5.4.0. |
Los errores que se notifican y los que se ignoran se controla mediante la directiva error_reporting
de php.ini
En ocasiones la notificación de errores estará deshabilitada, así que es algo a tener en cuenta. En caso de que esté deshabilitada, poner el código siguiente al inicio para ver los errores es una solución si es que no puede activar las notificaciones de errores.
<?php error_reporting(E_ALL); ini_set("display_errors", 1); ?>[ADS_A1/]
Puede que en ocasiones quieras crear error logs en PHP
En estas ocasiones te convendrá, si quieres realizarlos con las herramientas que te brinda el lenguaje puedes utilizar las funciones set_error_handler y error_log. Con set_error_handler podrás definir que función deseas correr para el manejo de errores y con error_log podrás guardar el error en un archivo.
// Definir una función de manejo de errores personalizada function fErrorHandler($errno, $errstr, $errfile, $errline) { echo "Error [$errno]: $errstr in $errfile on line $errline"; } // Establecer la función de manejo de errores personalizada set_error_handler("fErrorHandler");
Este es solo un ejemplo del uso de la función, pero puedes combinarla con la función error_log para que el error sea guardado en un archivo
// Definir una función de manejo de errores personalizada function fErrorHandler($errno, $errstr, $errfile, $errline) { // Construir el mensaje de error $errorMessage = "Error [$errno]: $errstr in $errfile on line $errline"; // Guardar el mensaje de error en un archivo de registro error_log($errorMessage . PHP_EOL, 3, "errores_en_programa.txt"); } // Establecer la función de manejo de errores personalizada set_error_handler("fErrorHandler");[ADS_A2/]
Errors logs with PHP.ini
Otra forma de tener error logs es habilitando esta función en php.ini, aunque es bastante básico en comparación contra utilizar la función set_error_handler.
Puedes hacer algo como esto:
php.inilog_errors = On; display_errors = Off; error_log = /path_to_errorlog/errors.log;
Cuando haces esto no es necesario usar la función error_log, pero sí que puedes usarla en algún caso puntual en que el error necesite ser personalizado.
[ADS_A1/]Monolog
https://blastcoding.com/php-error-manejo-de-errores-en-php/#monologTambién puedes utilizar monolog para el manejo de errores, el cual es una biblioteca de terceros, pero muy utilizada en PHP así que no le faltara mantenimiento.
Monolog sends your logs to files, sockets, inboxes, databases and various web services. Special handlers allow you to build advanced logging strategies.
https://github.com/Seldaek/monolog
Como podemos ver en su página monolog podemos instalarlos con : composer require monolog/monolog
un ejemplo que nos da la página de monolog:
<?php use Monolog\Level; use Monolog\Logger; use Monolog\Handler\StreamHandler; // create a log channel $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Level::Warning)); // add records to the log $log->warning('Foo'); $log->error('Bar');
En teoría monolog funcionaria de la siguiente manera y digo funcionaria así porque no estoy familiarizado con monolog, vea el siguiente código.
2 canalesuse Monolog\Logger; use Monolog\Handler\StreamHandler; // Crear un nuevo logger (canal) para errores $errorLogger = new Logger('error_logger'); $errorLogger->pushHandler(new StreamHandler('/path/to/error.log', Logger::ERROR)); // Crear un nuevo logger (canal) para advertencias $warningLogger = new Logger('warning_logger'); $warningLogger->pushHandler(new StreamHandler('/path/to/warning.log', Logger::WARNING)); // Ejemplo de uso: registrar un mensaje de error $errorLogger->error('Este es un mensaje de error.'); // Ejemplo de uso: registrar una advertencia $warningLogger->warning('Esta es una advertencia.');
Vea que creo 2 canales, uno para los errores y uno para los warnings(advertencias).
- Anterior: Namespaces en PHP
- Siguiente: Manejo de excepciones en PHP