Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

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:

ValorConstanteDescripció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); 
?>

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");

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.ini
log_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.

Monolog

Tambié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 canales
use 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).

Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category