error_level 和 error_message 从哪里以及如何进入自定义错误处理函数?
From where and how do the error_level and error_message come in custom error handler function?
我正在学习 PHP 来自 w3school 的 PHP 教程。
在一章 "PHP Error Handling" 中,我正在研究 创建自定义错误处理程序。
我遇到了以下程序,其中定义了 自定义错误处理函数 。请看下面的代码。
<?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 中如何工作?
请用通俗易懂的语言向我解释。您也可以借助其他示例进行解释。其实我也明白就好了。
本机错误
由 PHP 本身或其扩展产生的所有错误都具有特定的消息和类型(严重级别,例如 E_NOTICE、E_WARNING、E_ERROR、 ETC)。此参数在源代码中设置。对于您的示例,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);
您的自定义处理程序收到的错误级别是 PHP 的 E_* 常量之一。您会找到可能的常量列表及其值 here.
在您的示例中,使用未定义的变量 $test
通常会导致 PHP 通知。因此,您在自定义处理程序中将值 8(即 E_NOTICE
)作为 $errno
。您无法更改错误消息,因为此错误是由 PHP.
内部生成的
尝试一下:删除自定义错误处理程序并查看 PHP 为您提供的使用未定义变量的错误。这正是您的自定义处理程序被调用的级别和消息。
我建议您使用 trigger_error()
函数 (see here) 试用您的处理程序。这是设置错误级别和自己发送消息的唯一方法。
另请注意,error_reporting ini 设置中的设置无关紧要!无论级别如何,您的自定义处理程序总是会收到所有错误消息。
请通读上面链接的手册页。
我正在学习 PHP 来自 w3school 的 PHP 教程。
在一章 "PHP Error Handling" 中,我正在研究 创建自定义错误处理程序。
我遇到了以下程序,其中定义了 自定义错误处理函数 。请看下面的代码。
<?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 中如何工作?
请用通俗易懂的语言向我解释。您也可以借助其他示例进行解释。其实我也明白就好了。
本机错误
由 PHP 本身或其扩展产生的所有错误都具有特定的消息和类型(严重级别,例如 E_NOTICE、E_WARNING、E_ERROR、 ETC)。此参数在源代码中设置。对于您的示例,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);
您的自定义处理程序收到的错误级别是 PHP 的 E_* 常量之一。您会找到可能的常量列表及其值 here.
在您的示例中,使用未定义的变量 $test
通常会导致 PHP 通知。因此,您在自定义处理程序中将值 8(即 E_NOTICE
)作为 $errno
。您无法更改错误消息,因为此错误是由 PHP.
尝试一下:删除自定义错误处理程序并查看 PHP 为您提供的使用未定义变量的错误。这正是您的自定义处理程序被调用的级别和消息。
我建议您使用 trigger_error()
函数 (see here) 试用您的处理程序。这是设置错误级别和自己发送消息的唯一方法。
另请注意,error_reporting ini 设置中的设置无关紧要!无论级别如何,您的自定义处理程序总是会收到所有错误消息。
请通读上面链接的手册页。