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相关经验文章,请参考: