如何检测产生错误的行,而不是执行错误的行.PHP


How to detect the line where an error was originated and not where the error was executed. PHP

我有一个类文件(例如:myclass.class.php),我在许多文件中包含和使用,每次我不正确使用类PHP都会给我返回一个错误,显示文件名和错误发生的行,问题是我总是得到myclass.class.php内的行,而不是文件中的实际行,其中错误是起源。

我知道我可以覆盖默认的错误处理程序,我创建了这个函数:

function customError($errno, $errstr, $errFile, $errLine){
   $error =  "- [".date("Y-m-d, H:i:s")."] Error on page ".$_SERVER["SCRIPT_NAME"]." from file $errFile on line $errLine: Error #[$errno] $errstr, ";
   $error.="Previous page: ".$_SERVER['HTTP_REFERER'].", IP:".$_SERVER['REMOTE_ADDR']."'n";
}
set_error_handler("customError");

但是到目前为止,没有一个变量($errno, $errstr, $errFile, $errLine)在生成的文件中给我错误行,我总是得到类文件的$errLine

任何想法?

感谢

示例(数字为行号:

在class_file.php

:

33 public function getRows($result){
34    return mysql_num_rows($result)
35 }
在another_file.php

101 $rows = $myclass->getRows('this is not a mysql result');

错误如下:

错误的class_file.php, mysql_num_rows()期望参数1是资源;第34行

我想在another_file。php中得到第101行,这实际上是错误产生的地方。如:

another_file.php 101行错误,在class_file.php中执行:mysql_num_rows()期望参数1是资源;第34行

谢谢

最好的解决方案是添加更健壮的错误处理,这样如果类被错误地使用,它会让您知道。当然,这意味着您知道需要处理的异常的范围。实现更好的错误处理程序只是一个开始。您可以使用debug_backtrace()来跟踪调用堆栈。

回溯的第一个元素始终是当前函数/方法,然后是该函数/方法的调用者,依此类推。在错误处理程序中,第一个元素是错误处理程序函数。考虑到这一点,并基于您的示例代码,您可以执行以下操作:

function customError($errno, $errstr, $errFile, $errLine){
    $backtrace = debug_backtrace();
    $error =  "- [".date("Y-m-d, H:i:s")."] Error on page ".$_SERVER["SCRIPT_NAME"]." from file ".$backtrace[2]['file']." on line ".$backtrace[2]['line'].": Error #[$errno] $errstr, ";
    $error.="Previous page: ".$_SERVER['HTTP_REFERER'].", IP:".$_SERVER['REMOTE_ADDR']."'n";
    die $error;
}

当然,这在一定程度上是基于示例代码的人为示例。您真正需要做的是遍历回溯数组并报告所有相关信息。但这应该是你的开始。

如果你想知道你可以从回溯中得到的一切,只需从错误处理程序中运行echo '<pre>' , print_r(debug_backtrace(),TRUE) , '</pre>';

根据请求的附加代码,实际上是在类中引起错误的。

代码:

public function getRows($result){
    return mysql_num_rows($result)
}

如果用户提供的结果不是资源,你的类将盲目地使用它。您需要在使用它之前确定它是否是一个有效的资源,或者只是允许它失败。

例如:

public function getRows($result){
    if (!$result || !is_resource($result)) {
        $trace = debug_backtrace();
        trigger_error(
            'getRows expects valid mysql resource' .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return false;
    }
    return mysql_num_rows($result);
}

或者如果您的错误处理程序尊重静音:

public function getRows($result) {
    $rows = @mysql_num_rows($result);
    if ($rows !== FALSE) {
        return $rows;
    }
    else {
        $trace = debug_backtrace();
        trigger_error(
            'getRows expects valid mysql resource' .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return false;
    }
}

另外,您可以考虑设置xdebug。那你就不用担心这个了。http://xdebug.org/