我有一个类文件(例如: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行
由于
答案 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/