odbc_errormsg
non segnala i messaggi di errore da odbc_execute
nel modo previsto. Si limita a lanciare un avvertimento. Quindi sono stato costretto a scrivere un trucco per analizzare il messaggio di errore tramite error_get_last
.error_get_last() e gestore di errori personalizzato
sto usando set_error_handler
e error_get_last
ritorna NULL
a meno che non sia:
a disattivare il mio gestore di errori,
o farla tornare
FALSE
.
avrei Suppongo che questo è dovuto al gestore di errore built-in di PHP avendo cura di memorizzare i dettagli di errore da qualche parte in modo che possano essere recuperati in seguito.
C'è un modo per emulare tale comportamento nel mio gestore degli errori personalizzato in modo che error_get_last()
può essere utilizzato normalmente?
Nota: conosco già diversi modi per recuperare le informazioni di errore in qualsiasi momento. La mia domanda è come rendere utilizzabile error_get_last
.
Aggiornamento: Penso meglio che postare un certo codice.
PHP ha error_get_last()
, che permette di fare questo:
@fopen('xxx');
var_dump(error_get_last());
... e ottenere questo:
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)
}
Questo rompe se si sostituisce il gestore degli errori incorporato:
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
Se mantieni entrambi i gestori degli errori ...
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;
... si ottiene effetti collaterali:
[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
... invece di:
[Error happened: Undefined variable: foo]
Voglio il mio gestore di errore personalizzato per interfacciarsi correttamente con error_get_last
. Voglio che error_get_last
funzioni correttamente.
Accetteresti di utilizzare una funzione diversa (definita dall'utente)? Perché se lo si volesse, si potrebbe semplicemente archiviare l'ultimo errore in una variabile globale e avere una funzione che restituisce semplicemente $ GLOBALS ['varname']; ' – DaveRandom
Il ritorno' false' non è accettabile? Se è così, perché? – Jon
Inoltre, hai provato ad assegnare un valore a ['$ php_errormsg'] (http://uk.php.net/manual/en/reserved.variables.phperrormsg.php)? Non ho idea se questo potrebbe raggiungere (o addirittura influenzare) qualcosa, ma potrebbe valere la pena di provare ... – DaveRandom