我的网站是完全自定义的,因此我想知道我编写的代码写得不好。我使用set_exception_handler和set_error_handler来使用自定义类将错误记录到文件中。这包括通知和警告。
在我自己的代码中,这很好,因为我得到的日志非常少,而我得到的是我真正想要解决的问题。
然而,我刚刚开始使用simplePie,因为它与PHP4兼容,我收到了大量的通知,主要是为了静态调用函数或通过引用错误地传递内容。
通过修复simplePie对我来说太过分了,如果不是,我首先不会使用它。
有没有办法可以专门忽略某个文件或类生成的错误?这里概述了我的基本异常处理方式:
set_exception_handler("CustomExceptionHandler"); set_error_handler("customErrorHandler"); /** * CustomExceptionHandler() * * This is used if an exception is thrown that isn't caught. * * @param object $e The exception as an object */ function CustomExceptionHandler(Exception $e) { exitToError($e->getMessage()); } /** * customErrorHandler() * * This is called for any errors no matter what their level. */ function customErrorHandler($errno, $errstr, $errfile, $errline) { if(in_array($errno, array(E_USER_ERROR, E_RECOVERABLE_ERROR))) { throw new CustomErrorException($errstr, 0, $errno, $errfile, $errline); } else { CustomException::logError($errstr, $errno, $errfile, $errline); } return FALSE; } /** * class CustomErrorException * * Used by custom_error_handler() to convert all fatal * errors to exceptions. * * @see custom_error_handler() * @see http://www.php.net/manual/en/class.errorexception.php */ class CustomErrorException extends CustomException { /** * $severity * * The severity level of the exception * * @access protected * @var int */ protected $severity; /** * __construct() * * Constructs the new exception * * @access public * @param string $message The Exception message * @param int $code The Exception code * @param int $severity The severity level of the exception * @param string $filename The filename where the exception was thrown * @param int $lineno The line number where the exception was thrown */ public function __construct($message, $code = null, $severity = E_ERROR, $filename = null, $lineno= null) { $this->message = $message; $this->code = $code; $this->severity = (int)$severity; $this->file = $filename; $this->line = $lineno; self::logError($this->message,$this->code,$this->file,$this->line,$this->getTraceAsString()); } } /** * class CustomException * * Overwrites Exception to give us more control on how * exceptions are handled and logged. * * @see http://www.php.net/manual/en/language.exceptions.extending.php */ class CustomException extends Exception { /** * __construct * * We call the parent contruct as we still want it to do all its magic. We just want * overwrite this method so that we can log the error exactly how we want. */ public function __construct($message, $code = 0, Exception $previous = NULL) { parent::__construct($message, $code); self::logError($this->getMessage(),$this->getCode(),$this->getFile(),$this->getLine(),$this->getTraceAsString()); } /** * __toString() * * We overwrite this function so that we can use our stringBuilder function. */ public function __toString() { return self::stringBuilder($this->getMessage(),$this->getCode(),$this->getFile(),$this->getLine(),$this->getTraceAsString()); } /** * stringBuilder() * * We use this method so that we have a standard method of building error * strings that anything can tap into. * * @access public * @param string $message the exception message * @param int $code the code assigned to this exception * @param string $file the file where the exception occurred * @param int $line the line where the exception occurred * @param string $trace backtrace */ public function stringBuilder($message, $code, $file, $line, $trace='') { //return "[".date("d-M-Y H:i:s")."] ".$this->getMessage()." in ".$this->getFile().":".$this->getLine()."\nStack trace:\n".$this->getTraceAsString()."\n"; return "[".date("d-M-Y H:i:s")."] ".$message." in ".$file.":".$line."\n"; } /** * logError() * * We use a method so that we have a standard way of saving errors * to a log. * * We use XML because it's easy to parse. * * @access public * @param string $message the exception message * @param int $code the code assigned to this exception * @param string $file the file where the exception occurred * @param int $line the line where the exception occurred * @param string $trace backtrace * @todo We could improve it to write to the xml file using DomDocument * as laid out here http://www.xml-training-guide.com/append-delete-data-from-xml-using-php.html */ public function logError($message, $code, $file, $line, $trace='') { //Save it to a standard text file to guarentee saving the error file_put_contents(ROOT_URL.ERROR_LOG_TXT,self::stringBuilder($message, $code, $file, $line, $trace),FILE_APPEND); } }
以下是simplePie抛出的两个错误的示例:
[01-Aug-2010 00:50:33] Assigning the return value of new by reference is deprecated in ***\SimplePie.php:738 [01-Aug-2010 00:50:34] Non-static method SimplePie_Misc::parse_date() should not be called statically in ***\SimplePie.php:60
答案 0 :(得分:4)
有没有办法可以专门忽略某个文件或类生成的错误?
应该很容易!您可以签入自定义错误处理程序
function customErrorHandler($errno, $errstr, $errfile, $errline)
$errfile
是否在其中一个simplePie文件中,并且在这种情况下return true;
是静默的。
答案 1 :(得分:0)
您可以检查传递给错误处理程序的$ errfile参数,以查看错误是否源自simplePie中的某个位置。 文档:http://php.net/manual/en/function.set-error-handler.php
答案 2 :(得分:-1)
您必须删除这些错误 1.删除&在诸如$ foo =& new Object()的作业中 2.如果不是静态方法,则无法以静态方式访问方法,因此, Object :: method()应尝试使用 Object->方法()或尝试将函数方法()更改为静态函数方法()
或者最好的解决方案 - 尝试在php5中找到库