Мой сайт полностью настроен, поэтому я хотел бы знать, когда у меня плохо написан код.Я использую 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