Откуда и как error_level и error_message попадают в пользовательскую функцию обработчика ошибок?

Я изучаю PHP по учебнику по PHP от w3school.

В главе "Обработка ошибок PHP" я изучаю тему Создание пользовательского обработчика ошибок.

Я наткнулся на следующую программу, в которой определена Пользовательская функция обработчика ошибок. См. приведенный ниже код.

<?php
  //error handler function
  function customError($errno, $errstr) {
    echo "<b>Error:</b> [$errno] $errstr";
  }

  //set error handler
  set_error_handler("customError");

  //trigger error
  echo($test);
?>

Вывод приведенного выше кода выглядит следующим образом:

Ошибка: [8] Неопределенная переменная: тест

Я сомневаюсь, что, поскольку я нигде в программе не указал уровень ошибки и сообщение об ошибке, то откуда и как пользовательская функция ошибки получает уровень ошибки и сообщение об ошибке?

Как весь этот настраиваемый механизм обработки ошибок работает в PHP?

Объясните пожалуйста простым и понятным языком. Можно пояснить и на другом примере. На самом деле, лучше бы и мне понять.


person PHPFan    schedule 29.12.2016    source источник


Ответы (2)


Уровень ошибки, который получает ваш пользовательский обработчик, является одной из констант PHP E_*. Список возможных констант и их значений вы найдете здесь.

В вашем примере использование неопределенной переменной $test обычно вызывает уведомление PHP. Поэтому вы получаете значение 8 (которое равно E_NOTICE) как $errno в своем пользовательском обработчике. Вы не можете изменить сообщение об ошибке, так как эта ошибка генерируется внутри PHP.

Попробуйте: удалите пользовательский обработчик ошибок и посмотрите на ошибку, которую PHP выдает при использовании неопределенной переменной. Это именно тот уровень и сообщение, с которым вызывается ваш собственный обработчик.

Я предлагаю вам попробовать ваш обработчик с помощью функции trigger_error() (см. здесь ). Это единственный способ установить уровень ошибки и сообщение самостоятельно.

Обратите также внимание, что не имеет значения, что установлено в настройке error_reporting ini! Ваш пользовательский обработчик всегда получает ВСЕ сообщения об ошибках независимо от уровня.

Пожалуйста, прочтите страницы руководства, указанные выше.

person Mathias Barresi    schedule 29.12.2016

Собственные ошибки

Все ошибки, создаваемые самим PHP или его расширениями, имеют определенное сообщение и тип (уровень серьезности, такой как E_NOTICE, E_WARNING, E_ERROR и т. д.). Эти параметры задаются в исходном коде. Например, zend_execute.c:

static zend_never_inline ZEND_COLD void zval_undefined_cv(uint32_t var, const zend_execute_data *execute_data)
{
    zend_string *cv = CV_DEF_OF(EX_VAR_TO_NUM(var));

    zend_error(E_NOTICE, "Undefined variable: %s", ZSTR_VAL(cv));
}

Пользовательские ошибки

Вы можете сгенерировать ошибку на уровне пользователя с помощью функции trigger_error(). Это позволяет указать собственное сообщение и один из E_USER_* типов для выдаваемой ошибки.

trigger_error("Some message", E_USER_ERROR); 
person Timurib    schedule 29.12.2016