PHP: игнорирование ошибок и уведомлений в определенном классе - PullRequest
4 голосов
/ 01 августа 2010

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

Ответы [ 3 ]

4 голосов
/ 01 августа 2010

Есть ли способ, которым я могу специально игнорировать ошибки, генерируемые определенным файлом или классом?

Должно быть легко! Вы можете проверить свой собственный обработчик ошибок

function customErrorHandler($errno, $errstr, $errfile, $errline)

находится ли $errfile в одном из простых файлов Pie, и в этом случае return true; молча.

0 голосов
/ 01 августа 2010

Вы можете проверить параметр $ errfile, передаваемый в ваш обработчик ошибок, чтобы увидеть, происходит ли ошибка где-то внутри simplePie. Документация: http://php.net/manual/en/function.set-error-handler.php

0 голосов
/ 01 августа 2010

Вы должны удалить эти ошибки.
1. Удалить & в назначениях, таких как $ foo = & new Object ()
2. Вы не можете получить статический доступ к методу, если онне статический метод, поэтому вместо Object :: method () вам следует попробовать использовать Object-> method () или изменить function method () на метод статической функции ()

Или лучшее решение - попробуйте найти библиотеку в php5

...