php教程,如何利用trigger_error()编程触发自定义错误?
发布于 作者:苏南大叔 来源:程序如此灵动~虽然在生产模式下,考虑到用户体验的问题,要尽量减少错误输出的机会。但是,错误只是限制于被使用者所看到。并不是说不能触发这种错误,触发后是否展示并不是目前所需要考虑的问题。那么,“主动触发错误”反应到php
编程语言里面,就是trigger_error()
函数了。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的编程经验总结。测试环境::win10
,nginx@1.15.11
,php@8.2.10-nts
。
显示错误
如果不显示错误信息的话,请检查php.ini
:
display_errors=On
display_startup_errors = On
或者文件顶部,是否开启了下面的代码:
error_reporting(E_ALL);
参考文章:
触发错误trigger_error()
触发自定义错误的trigger_error()
的函数原型,默认是E_USER_NOTICE
级别。
trigger_error(string $message, int $error_level = E_USER_NOTICE): bool
测试代码:
trigger_error("触发Error", E_USER_ERROR); // 256,fatal error,会停止执行
trigger_error("触发Warning", E_USER_WARNING); // 512
trigger_error("默认触发Notice"); // 1024
trigger_error("触发Notice", E_USER_NOTICE); // 1024
trigger_error("触发Deprecated", E_USER_DEPRECATED); // 16384
这里需要注意的是:
- 用户自定义错误是有不同的错误级别的,默认是警告
warning
级别。 - 其中
E_USER_ERROR
级别的,是个fatal error
,会导致程序停止执行。其它的错误级别,并不会停止代码执行。
参考文章:
可用错误级别
php
中预定义的错误级别常量,有16个。其中,表示程序员可以编程主动触发的错误有四种,分别是:E_USER_ERROR
、E_USER_WARNING
、E_USER_NOTICE
、E_USER_DEPRECATED
。
E_USER_
就表示区别于php
自身的报错信息了,似乎这命名有些歧义。
参考文章:
trigger_error()返回值
trigger_error("随便触发某个级别的错误",E_ALL);
返回值是个布尔型,官方的说法是:“如果指定了错误的error_level
,会返回false
,正确则返回true
。” 然而,在本文的实验中,传递了错误的级别的时候,是直接报错的,并没有返回false
。
Fatal error: Uncaught ValueError: trigger_error(): Argument #2 ($error_level) must be one of E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, or E_USER_DEPRECATED
所以,对于苏南大叔目前的实验来说,trigger_error()
的返回值,只有fatal error
和bool(true)
真两种情况了。
try catch不能捕获trigger_error()
实验表明:try catch
无法捕获trigger_error()
错误。
try {
trigger_error("触发"); // 不停止执行
} catch (Exception $e) {
echo "found";
}
try {
trigger_error("触发",E_USER_ERROR); // 停止执行
} catch (Error $e) {
echo "found";
}
set_error_hanlder()能捕获trigger_error()
实际上trigger_error()
是通过set_error_hanlder()
来进行捕获的。最简单的例子,如下:
set_error_handler("customError");
function customError($errno, $errstr) {
var_dump(func_get_args());
}
trigger_error("触发Error", E_USER_ERROR);
set_error_hanlder()
还有更多的使用注意事项。由于篇幅关系,这里就简单的知道可以使用它的方式就可以了。参考文章:
抑制错误输出
function test(){
// trigger_error("触发Error", E_USER_ERROR); // 256
trigger_error("触发Warning", E_USER_WARNING); // 512
trigger_error("默认触发Notice"); // 1024
trigger_error("触发Notice", E_USER_NOTICE); // 1024
trigger_error("触发Deprecated", E_USER_DEPRECATED); // 16384
}
@test(); // 除了E_USER_ERROR外,其它都可以被抑制
@trigger_error("默认触发notice");
@trigger_error("默认触发error",E_USER_ERROR);
echo "没有致命错误的话就可以执行";
这里还是E_USER_ERROR
这个错误级别是特殊的,它不能被@
符号所抑制错误输出。其它级别的都是可以的,比如:E_USER_WARNING
、E_USER_NOTICE
、E_USER_DEPRECATED
。
相关文章
- https://www.php.net/manual/en/function.trigger-error
- https://www.php.net/manual/en/function.set-exception-handler.php
- https://www.php.net/manual/en/function.set-error-handler.php
结束语
更多苏南大叔的php
相关经验文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。