terminar son para objeto method las destruir constructore alternativas php error-handling fatal-error

son - php method constructor



Manejar errores fatales en PHP usando register_shutdown_function() (4)

De acuerdo con el comentario sobre esta respuesta , es posible detectar los errores fatales a través de una función de apagado que no se puede capturar usando set_error_handler() .

Sin embargo, no pude averiguar cómo determinar si el cierre se produjo debido a un error fatal o debido a que el script llegó a su fin.

Además, las funciones de seguimiento de depuración parecen haber desaparecido en la función de apagado, lo que hace que no valga la pena registrar el seguimiento de la pila donde se produjo el error fatal.

Entonces mi pregunta es: ¿cuál es la mejor forma de reaccionar ante los errores fatales (especialmente las llamadas a funciones no definidas) mientras se mantiene la capacidad de crear una traza inversa adecuada?


Esto funciona para mí:

function shutdown() { $error = error_get_last(); if ($error[''type''] === E_ERROR) { // fatal error has occured } } register_shutdown_function(''shutdown''); spl_autoload_register(''foo''); // throws a LogicException which is not caught, so triggers a E_ERROR

Sin embargo, probablemente ya lo sepas, pero solo para asegurarte de que no puedas recuperarte de un E_ERROR de ninguna manera.

En cuanto a la traza inversa, no se puede ... :( En la mayoría de los casos se trata de un error fatal, especialmente de errores de función indefinidos , en realidad no es necesario. La localización exacta del archivo / línea donde se produjo es suficiente. La traza inversa es irrelevante en ese caso.


Solo un buen truco para obtener el método error_handler actual =)

<?php register_shutdown_function(''__fatalHandler''); function __fatalHandler() { $error = error_get_last(); //check if it''s a core/fatal error, otherwise it''s a normal shutdown if($error !== NULL && $error[''type''] === E_ERROR) { //Bit hackish, but the set_exception_handler will return the old handler function fakeHandler() { } $handler = set_exception_handler(''fakeHandler''); restore_exception_handler(); if($handler !== null) { call_user_func($handler, new ErrorException($error[''message''], $error[''type''], 0, $error[''file''], $error[''line''])); } exit; } } ?>

También quiero señalar que si llamas

<?php ini_set(''display_errors'', false); ?>

Php deja de mostrar el error; de lo contrario, el texto de error se enviará al cliente antes de que el controlador de errores


Una forma de distinguir entre el error fatal y el apagado correcto de la aplicación con la función register_shutdown_function es definir una constante como la última línea de su programa, y ​​luego verificar si la constante está definida:

function fatal_error() { if ( ! defined(PROGRAM_EXECUTION_SUCCESSFUL)) { // fatal error has occurred } } register_shutdown_function(''fatal_error''); define(''PROGRAM_EXECUTION_SUCCESSFUL'', true);

Si el programa llega al final, no podría haber encontrado un error fatal, por lo que sabemos que no ejecutará la función si se define la constante.

error_get_last () es una matriz con toda la información relativa al error fatal que debe ser depurada, aunque no tendrá una traza inversa, como se ha mencionado.

En general, si su programa php ha encontrado un error fatal (a diferencia de una excepción), desea que el programa explote para que pueda encontrar y solucionar el problema. He descubierto que register_shutdown_function es útil para entornos de producción en los que desea informes de errores, pero desea alguna manera de registrar el error en segundo plano para que pueda responder. También puede utilizar la función para dirigir al usuario a una página html amigable en caso de que se produzca dicho error, de modo que no solo muestre una página en blanco.


Yo uso "ob_start" para esto.

function fatal_error_handler($buffer) { if (preg_match("|(Fatal error:)(.+)|", $buffer, $regs) ) { //Your code } return $buffer; } ob_start("fatal_error_handler");