« »
Jan 14

Tal como comentaba en el post anterior voy a explicar como capturar los fatal errors del PHP para poder tratarlos en la medida de lo posible. Según este mensaje de la lista de desarrollo del PHP (fijaros en los autores) los fatal errors nunca podrán ser capturados en el userland, por ejemplo con un handler de errores personalizado, ya que en estos casos el intérprete es probable que quede en un estado inestable y es necesario de una terminación rápida y limpia.

Podemos conseguir un buen comportamiento ante los fatal error configurando adecuadamente las directivas implicadas. Sólo editando el php.ini podemos conseguir que se muestre un mensaje personalizado por pantalla, que se guarde en archivo o no, etc. Para más detalles podéis consultar el capítulo sobre el tema en el manual del PHP. Lo que aquí se describe es una forma alternativa que nos permite tenerlo controlado desde nuestro código PHP. Como requisitos hemos de tener configurado el PHP para que nos muestre errores por pantalla mediante la directiva de configuración display_errors.

La idea es sencilla, se trata de capturar todo el output buffer de nuestra aplicación y antes de enviarlo al usuario parsearlo en busca de la palabra “error” en negrita seguida de dos puntos con un mensaje y un salto de línea. El fallo es que, lógicamente, si nosotros sacamos por pantalla un string que cumpla lo anterior lo detectaremos como un fatal error del intérprete… aunque es muy difícil que tengamos una cadena de texto que cumpla estas condiciones a no ser que sean errores de nuestra aplicación, en ese caso siempre les podemos cambiar el texto o también podemos configurar la directiva error_prepend_string con una key identificable y modificar el código aquí incluido.

El código es el siguiente:

[php] function fatal_error_handler($buffer) {
if (ereg(“(error:)(.+)(/”,””,$regs[2]);
error_log($err,1,’tu.email@de.alertas.com’);
return ‘Mensaje de error personalizado para el usuario’;
}
return $buffer;
}
ob_start(“fatal_error_handler”);
funcion_que_no_existe();
ob_end_flush(); [/php]

Entre lo aquí descrito y el handler de errores detallado en el post anterior deberíamos tener cualquier error del PHP bajo control. Existen otros errores que no vamos a poder controlar nunca como son todos los errores de sintaxis que provocan parse errors, por ejemplo que falte un “;”, estos normalmente se detectan en la etapa de desarrollo y no se espera que sucedan en producción… y si suceden sólo nos queda tener correctamente configuradas las directivas pertinentes del PHP.

Be Sociable, Share!
Tagged with:

2 Responses to “Capturando los fatal errors del PHP con nuestro handler”

  1. Fids says:

    Excelente aporte amigo… de verdad… muy ingenioso

  2. Sebastian says:

    Sos un genio!!!!!

    A veces los problemas mas complejos tienen la solucion mas simple.

    Te felicito!!!!!!!!!!!!!!!!!!!

    Avellaneda, Buenos Aires, Argentina.

Leave a Reply

preload preload preload