Откуда и как 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?

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

0

Решение

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

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

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

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

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

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

1

Другие решения

Родные ошибки

Все ошибки, вызванные самим 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);
1