php - sexualidad - set_error_handler No funciona Cómo quiero que funcione
problemas sexualidad hombre (6)
¿Por qué mi manejador de error personalizado no detecta funciones no definidas? ¿Hay otros problemas que esto cause?
En una suposición, diría que los errores de función indefinidos viajan a través de una ruta de ejecución diferente que otros tipos de error. Tal vez los diseñadores de PHP podrían decirle más, excepto que dudo que PHP esté diseñado de alguna manera.
Si desea que sus scripts fallen correctamente mientras aún los escribe en estilo PHP, intente poner toda la página en una función y luego try..catch
dentro de un bloque try..catch
.
Estoy dando el salto: ¡mis scripts de php TODOS fallarán graciosamente!
Al menos, eso es lo que espero ...
No quiero envolver (prácticamente) cada línea en intento ... leer declaraciones, así que creo que mi mejor opción es crear un controlador de error personalizado para el comienzo de mis archivos.
Lo estoy probando en una página de práctica:
function customError($level,$message,$file,$line,$context) {
echo "Sorry, an error has occured on line $line.<br />";
echo "The function that caused the error says $message.<br />";
die();
}
set_error_handler("customError");
echo($imAFakeVariable);
Esto funciona bien, regresando:
Lo sentimos, se ha producido un error en la línea 17. La función que provocó el error dice Variable no definida: imAFakeVariable.
Sin embargo, esta configuración no funciona para funciones no definidas.
function customError($level,$message,$file,$line,$context) {
echo "Sorry, an error has occured on line $line.<br />";
echo "The function that caused the error says $message.<br />";
die();
}
set_error_handler("customError");
imAFakeFunction();
Esto devuelve:
Error fatal: llamada a la función no definida: imafakefunction () en /Library/WebServer/Documents/experimental/errorhandle.php en la línea 17
¿Por qué mi manejador de errores personalizado no detecta funciones no definidas? ¿Hay otros problemas que esto cause?
De la documentación (énfasis agregado):
Los siguientes tipos de error no pueden manejarse con una función definida por el usuario: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING y la mayor parte de E_STRICT creada en el archivo donde se llama a set_error_handler ().
Llamar a funciones no definidas desencadena un E_ERROR, por lo tanto, no puede ser manejado por la devolución de llamada de error (o por los manejadores de excepciones para el caso). Todo lo que puede hacer es establecer error_reporting en 0.
PD, si está ejecutando su propio manejador de errores, debe tener cuidado de manejar correctamente el operador @. De la documentación (énfasis agregado):
Es importante recordar que el controlador de errores PHP estándar está completamente anulado. La configuración de error_reporting () no tendrá ningún efecto y se llamará a su controlador de errores independientemente, sin embargo, aún puede leer el valor actual de error_reporting y actuar de forma adecuada. De particular interés es que este valor será 0 si la instrucción que causó el error fue antepuesta por el operador @ error-control.
set_error_handler
está diseñado para manejar los errores con los códigos de: E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE
E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE
E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE
. Esto se debe a que set_error_handler
está destinado a ser un método para informar errores lanzados por la función de error del usuario trigger_error
.
Sin embargo, encontré este comentario en el manual que puede ser útil:
"Los siguientes tipos de error no pueden manejarse con una función definida por el usuario:
E_ERROR
,E_PARSE
,E_CORE_ERROR
,E_CORE_WARNING
,E_COMPILE_ERROR
,E_COMPILE_WARNING
y la mayoría deE_STRICT
en el archivo donde se llama aset_error_handler()
."Esto no es exactamente cierto.
set_error_handler()
no puede manejarlos, peroob_start()
puede manejar al menosE_ERROR
.
<?php function error_handler($output) { $error = error_get_last(); $output = ""; foreach ($error as $info => $string) $output .= "{$info}: {$string}/n"; return $output; } ob_start(''error_handler''); will_this_undefined_function_raise_an_error(); ?>
Realmente, estos errores deberían ser reportados silenciosamente en un archivo, por ejemplo. ¡Espero que no tenga muchos errores E_PARSE
en su proyecto! :-)
En cuanto a los informes de errores generales, adhiérase a Excepciones (me parece útil hacer que se vinculen con mi sistema MVC). Puede crear una Excepción bastante versátil para proporcionar opciones mediante botones y agregar una gran cantidad de descripción para que el usuario sepa lo que está mal.
Algo muy interesante que descubrí hoy cuando enfrentaba el problema similar. Si usa lo siguiente, detectará el error con su función / método personalizado de gestión de errores:
ini_set(''display_errors'', ''Off'');
error_reporting(-1);
set_error_handler(array("Cmd/Exception/Handler", "getError"), -1 & ~E_NOTICE & ~E_USER_NOTICE);
Al establecer ''display_errors'' en ''Off'', puede capturarlos y capturarlos con el controlador.
Supongo que necesita usar register_shutdown_function
también
Por ejemplo:
register_shutdown_function( array( $this, ''customError'' ));.
function customError()
{
$arrStrErrorInfo = error_get_last();
print_r( $arrStrErrorInfo );
}
He estado jugando con el manejo de errores por un tiempo y parece que funciona en su mayor parte.
function fatalHandler() {
global $fatalHandlerError, $fatalHandlerTitle;
$fatalHandlerError = error_get_last();
if( $fatalHandlerError !== null ) {
print($fatalHandlerTitle="{$fatalHandlerTitle} | ".join(" | ", $fatalHandlerError).
(preg_match("/memory/i", $fatalHandlerError["message"]) ? " | Mem: limit ".ini_get(''memory_limit'')." / peak ".round(memory_get_peak_usage(true)/(1024*1024))."M" : "")."/n".
"GET: ".var_export($_GET,1)."/n".
"POST: ".var_export($_POST,1)."/n".
"SESSION: ".var_export($_SESSION,1)."/n".
"HEADERS: ".var_export(getallheaders(),1));
}
return $fatalHandlerTitle;
}
function fatalHandlerInit($title="phpError") {
global $fatalHandlerError, $fatalHandlerTitle;
$fatalHandlerTitle = $title;
$fatalHandlerError = error_get_last();
set_error_handler( "fatalHandler" );
}
Ahora tengo un problema donde si la memoria está agotada, no la informa cada vez. Parece que depende de la cantidad de memoria que se está utilizando. Hice una secuencia de comandos para cargar un archivo grande (lleva ~ 6.6M de memoria) en un bucle infinito. Setup1:
ini_set(''memory_limit'', ''296M'');
fatalHandlerInit("testing");
$file[] = file("large file"); // copy paste a bunch of times
En este caso, recibo el error de ser informes y muere en la carga de 45 archivos.
Setup2 - igual pero cambio: ini_set (''memory_limit'', ''299M'');
Esta vez no recibo un error y ni siquiera llama a mi función de error personalizada. La secuencia de comandos muere en la misma línea.
¿Alguien tiene una pista de por qué y cómo solucionarlo?