我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

虽然在生产模式下,考虑到用户体验的问题,要尽量减少错误输出的机会。但是,错误只是限制于被使用者所看到。并不是说不能触发这种错误,触发后是否展示并不是目前所需要考虑的问题。那么,“主动触发错误”反应到php编程语言里面,就是trigger_error()函数了。

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - 触发自定义错误
php教程,如何利用trigger_error()编程触发自定义错误?(图7-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的编程经验总结。测试环境::win10nginx@1.15.11php@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

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - fatal-error
php教程,如何利用trigger_error()编程触发自定义错误?(图7-2)

这里需要注意的是:

  • 用户自定义错误是有不同的错误级别的,默认是警告warning级别。
  • 其中E_USER_ERROR级别的,是个fatal error,会导致程序停止执行。其它的错误级别,并不会停止代码执行。

参考文章:

可用错误级别

php中预定义的错误级别常量,有16个。其中,表示程序员可以编程主动触发的错误有四种,分别是:E_USER_ERRORE_USER_WARNINGE_USER_NOTICEE_USER_DEPRECATED

E_USER_就表示区别于php自身的报错信息了,似乎这命名有些歧义。

参考文章:

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - fatal-error2
php教程,如何利用trigger_error()编程触发自定义错误?(图7-3)

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 errorbool(true)真两种情况了。

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - 错误级别报错
php教程,如何利用trigger_error()编程触发自定义错误?(图7-4)

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";
}

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - try-catch
php教程,如何利用trigger_error()编程触发自定义错误?(图7-5)

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()还有更多的使用注意事项。由于篇幅关系,这里就简单的知道可以使用它的方式就可以了。参考文章:

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - seterrorhanllder
php教程,如何利用trigger_error()编程触发自定义错误?(图7-6)

抑制错误输出

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_WARNINGE_USER_NOTICEE_USER_DEPRECATED

苏南大叔:php教程,如何利用trigger_error()编程触发自定义错误? - @符号抑制错误输出
php教程,如何利用trigger_error()编程触发自定义错误?(图7-7)

相关文章

结束语

更多苏南大叔的php相关经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php