2

我有一个包含并在许多文件中使用的类文件(例如: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 行

谢谢

4

2 回答 2

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>';在错误处理程序中运行即可。

于 2013-06-12T01:20:03.747 回答
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/

于 2013-06-12T02:28:08.363 回答