【发布时间】:2011-12-14 12:12:44
【问题描述】:
odbc_errormsg
不会以应有的方式报告来自odbc_execute 的错误消息。它只是发出警告。所以我不得不写一个hack来通过error_get_last解析错误信息。
我使用set_error_handler 和error_get_last 返回NULL,除非我:
禁用我的错误处理程序,
或者让它返回
FALSE。
我想这是由于 PHP 的内置错误处理程序负责将错误详细信息存储在某处,以便以后检索它们。
有没有办法在我的自定义错误处理程序中模拟这种行为,以便error_get_last() 可以正常使用?
请注意,我已经知道几种随时检索错误信息的方法。我的问题是如何使error_get_last 可用。
更新:我想我最好发布一些代码。
PHP 有error_get_last(),它允许这样做:
@fopen('xxx');
var_dump( error_get_last() );
...然后得到这个:
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)
}
如果您替换内置的错误处理程序,这会中断:
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
如果您保留两个错误处理程序...
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;
...你会得到副作用:
[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
... 而不仅仅是:
[Error happened: Undefined variable: foo]
我想让我的自定义错误处理程序与error_get_last 正确交互。我希望error_get_last 能正常工作。
【问题讨论】:
-
您会接受使用不同的(用户定义的)函数吗?因为如果你愿意,你可以将最后一个错误存储在一个全局变量中,并拥有一个只执行
return $GLOBALS['varname'];的函数 -
不接受返回
false吗?如果有,为什么? -
另外,您是否尝试过为
$php_errormsg赋值?我不知道这是否会实现(甚至影响)任何事情,但可能值得一试...... -
@Jon - 因为它执行两个错误处理程序:首先是我的,然后是 PHP 的。我的是替代品,而不是补充品。
-
@ÁlvaroG.Vicario:我明白这一点。我的问题也可以表述为“如果让 PHP 的错误处理程序执行,它会导致什么问题?”。
标签: php error-handling