如何检测发生错误的行而不是错误执行的位置。 PHP

时间:2013-06-12 01:03:02

标签: php class error-handling

我有一个类文件(例如: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行,这实际上是错误发生的地方。像:

在class_file.php中执行的another_file.php第101行中的

错误:mysql_num_rows()期望参数1为资源;第34行

由于

2 个答案:

答案 0 :(得分:1)

最好的解决方案是添加更强大的错误处理,以便在错误使用类时让您知道。当然,这意味着您知道您需要处理的异常范围。实现更好的错误处理程序是一个开始。您可以使用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>';即可。

答案 1 :(得分:1)

根据要求的其他代码,您实际上是在您的课程中导致错误。

您的密码:

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/