获取set_error_handler中可生成错误的函数名称

时间:2014-03-11 17:09:45

标签: php error-handling

我在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(),但我不确定这是否可行。

感谢。

1 个答案:

答案 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类文件名,以找到合适的文件。)