Как вы получаете несколько обработчиков ошибок в PHP? - PullRequest
6 голосов
/ 10 февраля 2012

Я пробовал это:

    set_error_handler('ReportError', E_NOTICE | E_USER_NOTICE);
    set_error_handler('ErrorHandler', E_ALL & ~(E_NOTICE | E_USER_NOTICE));

Но работает только второй. Как мне использовать разные обработчики ошибок для разных типов ошибок?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2012

Почему бы не иметь один обработчик ошибок и фильтр по типу ошибки в обработчике и вызывать оттуда разные функции? Сделайте GenericErrorHandler() и сделайте в нем:

switch($errno){
   case E_USER_ERROR: UserErrorHandler(...); break;
}
3 голосов
/ 21 ноября 2014

Итак, чтобы понять, о чем говорит Уэсти, важная часть в том, что у вас может быть только один обработчик ошибок, а функция set_error_handler () возвращает ранее определенный обработчик ошибок, или ноль, если ни один из них не был определен.Поэтому в ваших обработчиках ошибок, возможно, используйте класс, который сохраняет предыдущий обработчик ошибок при его регистрации, чтобы при обработке ошибок с помощью метода класса также вызывался предыдущий обработчик ошибок.Выдержка из клиента raven-php Sentry:

    public function registerErrorHandler($call_existing_error_handler = true, $error_types = -1)
{
    $this->error_types = $error_types;
    $this->old_error_handler = set_error_handler(array($this, 'handleError'), error_reporting());
    $this->call_existing_error_handler = $call_existing_error_handler;
}

, а затем метод ошибки дескриптора:

    public function handleError($code, $message, $file = '', $line = 0, $context=array())
{
    if ($this->error_types & $code & error_reporting()) {
      $e = new ErrorException($message, 0, $code, $file, $line);
      $this->handleException($e, true, $context);
    }

    if ($this->call_existing_error_handler && $this->old_error_handler) {
        call_user_func($this->old_error_handler, $code, $message, $file, $line, $context);
    }
}
1 голос
/ 10 февраля 2012

Вы можете иметь один обработчик ошибок и обрабатывать ошибки, подобные этой (хорошо, это PHP 5.3, но извините - небольшие изменения, и это будет работать нормально)

set_error_handler(function($errno, $errstr, $errfile, $errline)
{
    switch($errno)
    {
        case E_ERROR:
        {
            # Bla bla bla, your code here
            return true;
        }
    }

    return false;
});

Если вам действительно нужно использовать два разныхset_error_handler, тогда вы можете использовать вызов функции, чтобы получить предыдущий обработчик ошибок.И даже тогда вы потеряете те ошибки, по которым вы фильтруете.

Хотя такой контроллер гораздо элегантнее.

...