我在php中设置自定义错误处理程序,如下所示:
<?php
function custom_error_handler($severity, $message, $file, $line, $errcontext)
{
//Need to get function name
echo sprintf("\n%s [%s@L%s] : %s \n", $severity, $file, $line, $message);
}
function test_error()
{
trigger_error("Just a user generated error");
}
set_error_handler( function($severity, $message, $file, $line, $errcontext) {
custom_error_handler($severity, $message, $file, $line, $errcontext);
} );
test_error();
是否有某种方式,在custom_error_handler
范围内获取触发/生成错误的函数名称,在本例中为test_error()
我已阅读文档debug_backtrace(),但我不确定这是否可行。
感谢。
答案 0 :(得分:1)
是的,在这种情况下,debug_backtrace是你需要的,但你也需要知道你真正想要追踪的是什么。
查看示例代码:
<?php
function custom_error_handler($severity, $message, $file, $line, $errcontext)
{
$dt = debug_backtrace();
$function = '';
$remove = array(__FUNCTION__,'trigger_error', '{closure}');
foreach ($dt as $dti) {
if (isset($dti['function']) && !in_array($dti['function'],$remove)) {
$function = $dti['function'];
break;
}
}
//Need to get function name
echo sprintf("\n%s [%s@L%s@%s] : %s \n", $severity, $file, $line, $function, $message)."<br />";
}
function test_error()
{
trigger_error("Just a user generated error");
}
set_error_handler( function($severity, $message, $file, $line, $errcontext) {
custom_error_handler($severity, $message, $file, $line, $errcontext);
} );
function bla_error() {
test_error();
}
bla_error();
trigger_error("Just a user generated error");
test_error();
在这种情况下,您将被退回:
1024 [D:\DaneAplikacji\easyphp\data\localweb\error.php@L27@test_error] : Just a user generated error
1024 [D:\DaneAplikacji\easyphp\data\localweb\error.php@L39@] : Just a user generated error
1024 [D:\DaneAplikacji\easyphp\data\localweb\error.php@L27@test_error] : Just a user generated error
因此在bla_error和test_error这两种情况下都会得到函数test_error,因为在这个函数中最终会启动trigger_error,但是当你不使用 break 时,你会得到启动test_error(如果有的话)的最终函数< / p>
我个人在DB类中使用了backtrace_ignore,当我想保存带有代码的文件名和查询启动行的查询时:
private function fetchLauncher()
{
$key = 0;
$dt = debug_backtrace();
for ($i=0,$c=count($dt);$i<$c;++$i) {
if (strpos($dt[$i]['file'],$this->settings['backtrace_ignore'])===false) {
$key = $i;
break;
}
}
$this->launcher['file'] = $dt[$key]['file'];
$this->launcher['line'] = $dt[$key]['line'];
}
(作为$ this-&gt; settings ['backtrace_ignore']我有我的DB类文件名,以找到合适的文件。)