odbc_errormsg
no informa los mensajes de error odbc_execute
de la forma en que se supone que debe. Simplemente lanza una advertencia. Así que me han obligado a escribir un truco para analizar el mensaje de error a través del error_get_last
.error_get_last() y controlador de error personalizado
estoy usando set_error_handler
y error_get_last
vuelve NULL
a menos que sea:
desactivo mi gestor de errores,
o hacerlo volver
FALSE
.
yo supongo que esto se debe al controlador de errores incorporado de PHP teniendo cuidado de almacenar los detalles del error en algún lugar para que puedan ser recuperados más tarde.
¿Hay alguna forma de emular dicho comportamiento en mi controlador de error personalizado para que error_get_last()
se pueda usar con normalidad?
Tenga en cuenta que ya sé varias formas de recuperar la información de error en cualquier momento. Mi pregunta es cómo hacer que error_get_last
sea utilizable.
Actualización: creo que será mejor que publicar algo de código.
PHP tiene error_get_last()
, lo que permite hacer esto:
@fopen('xxx');
var_dump(error_get_last());
... y conseguir esto:
array(4) {
["type"]=>
int(2)
["message"]=>
string(46) "fopen() expects at least 2 parameters, 1 given"
["file"]=>
string(69) "C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php"
["line"]=>
int(3)
}
Esto rompe si se reemplaza el controlador de errores incorporado:
function custom_error_handler($errno, $errstr, $errfile, $errline){
$ignore = ($errno & error_reporting()) == 0;
if(!$ignore){
echo "[Error happened: $errstr]\n";
}
return TRUE;
}
set_error_handler('custom_error_handler');
@fopen('xxx');
var_dump(error_get_last()); // NULL
Si conserva ambos controladores de errores ...
function custom_error_handler($errno, $errstr, $errfile, $errline){
$ignore = ($errno & error_reporting()) == 0;
if(!$ignore){
echo "[Error happened: $errstr]\n";
}
return FALSE;
}
set_error_handler('custom_error_handler');
error_reporting(E_ALL);
echo $foo;
... sufre efectos adversos:
[Error happened: Undefined variable: foo]
Notice: Undefined variable: foo in C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php on line 15
Call Stack:
0.0004 329720 1. {main}() C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php:0
... en lugar de simplemente:
[Error happened: Undefined variable: foo]
Quiero a mi manejador de error personalizado para interactuar correctamente con error_get_last
. Quiero que error_get_last
funcione bien.
¿Aceptarías utilizar una función diferente (definida por el usuario)? Porque si lo hiciera, podría almacenar el último error en una var global y tener una función que simplemente 'devuelva $ GLOBALS ['varname'];' – DaveRandom
¿No es aceptable devolver 'falso '? Si es así, ¿por qué? – Jon
Además, ¿ha intentado asignar un valor a ['$ php_errormsg'] (http://uk.php.net/manual/en/reserved.variables.phperrormsg.php)? No tengo idea de si esto lograría (o incluso afectaría) a algo, pero podría valer la pena intentarlo ... – DaveRandom