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

大家好,本次苏南大叔给大家带来的是一个有关php错误处理的教程,说的是php的异常处理函数set_exception_handler

苏南大叔:php错误处理之set_exception_handler - php错误处理之set_exception_handler
php错误处理之set_exception_handler(图14-1)

在开始本文的内容之前,建议大家先复习一下这篇文章:https://newsn.net/say/php-ini-error.html ,看看最传统的php的错误处理方案,然后再回头看看本文中的内容。也许会有更深刻的认识。

前言

本文的内容适合在php脚本内容中,控制错误输出。php的各种框架中,都会出现这个函数set_exception_handler

在php语言自身的概念内,error和exception是两个概念,而在大家的意识里面,这两个可能是同一个概念,都是“报错”。这点可能需要大家先弄弄清。而php5和php7对于set_exception_handler函数的解释也是不同的,具体的区别在哪里呢?请查看下面的内容。

范例代码

下面的是苏南大叔为大家编写的,本文的讲解demo范例。

echo "PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
function exception_handler($exception) {
    $errno = $exception->getCode();
    $errstr = $exception->getMessage();
    $errfile = $exception->getFile();
    $errline = $exception->getLine();
    $errtrace = $exception->getTraceAsString();
    echo "<b>出错了,错误如下:</b><br/><br/>";
    echo "代码: $errno <br />\n";
    echo "信息: $errstr <br />\n";
    echo "文件: $errfile <br />\n";
    echo "行号: $errline <br />\n";
    echo "trace: $errtrace <br />\n";
    //exit();
}
set_exception_handler('exception_handler');
//throw new Exception('这是个自定义异常exception');
//throw new Exception('这是个带编号的自定义异常exception',1);
//trigger_error("这是个无法捕捉的自定义的错误error");
//throw new Error('这是个带编号的自定义的错误error',2);
//this_is_an_on_purpose_error();
echo "恭喜,没有错误\n";

在这个范例中,苏南大叔将要演示,在php5、php7中,对于set_exception_handler的不同处理结果。

苏南大叔:php错误处理之set_exception_handler - 111
php错误处理之set_exception_handler(图14-2)

没有自定义错误处理函数时的截图

作为后文的对比,这里先展示些这些截图,显示系统默认对错误异常的处理情况。

苏南大叔:php错误处理之set_exception_handler - 004
php错误处理之set_exception_handler(图14-3)

苏南大叔:php错误处理之set_exception_handler - 000
php错误处理之set_exception_handler(图14-4)

php7中的set_exception_handler

在php7中,set_exception_handler函数,

  • 可以处理throw的exception和error,显示出一个错误后,自动停止响应。
  • 但是无法处理通过trigger_error触发的error,归于系统处理,并会继续执行。

苏南大叔:php错误处理之set_exception_handler - php7_exception
php错误处理之set_exception_handler(图14-5)

苏南大叔:php错误处理之set_exception_handler - php7_error
php错误处理之set_exception_handler(图14-6)

苏南大叔:php错误处理之set_exception_handler - php7_error2
php错误处理之set_exception_handler(图14-7)

苏南大叔:php错误处理之set_exception_handler - php7_trigger_error
php错误处理之set_exception_handler(图14-8)

php5中的set_exception_handler

php5中,set_exception_handler函数,

  • 可以处理throw的exception,显示出一个错误后,自动停止响应。
  • 但是无法处理任何的error,归于系统处理,并会继续执行。
  • php5中没有error这个类,无法throw一个Error,但是可以throw一个Exception

苏南大叔:php错误处理之set_exception_handler - php5_exception
php错误处理之set_exception_handler(图14-9)

苏南大叔:php错误处理之set_exception_handler - php5_exception2
php错误处理之set_exception_handler(图14-10)

苏南大叔:php错误处理之set_exception_handler - php5_trigger
php错误处理之set_exception_handler(图14-11)

苏南大叔:php错误处理之set_exception_handler - php5_not_support_error
php错误处理之set_exception_handler(图14-12)

苏南大叔:php错误处理之set_exception_handler - php5_error_sorry
php错误处理之set_exception_handler(图14-13)

总结

set_exception_handler这个函数,在php5和php7中,表现出较大差别。触发错误的方式不同,在php中也可能表现出不同的形式。php7中的set_exception_handler,可以捕获error和exception,php5中的set_exception_handler,只可以捕获exception。

无法捕获的错误和异常,将进入php系统处理。如果你设置了php.ini中的错误处理方式,那么你将可以在你可以期待的地方,看到这些没有被捕获的错误的描述信息。

苏南大叔:php错误处理之set_exception_handler - 99
php错误处理之set_exception_handler(图14-14)

总体来说,除了trigger_error之外,错误都是可以捕获的。但是对于error,在php5中,是通过另外的函数set_error_handler进行捕获的。在接下来的文章中,苏南大叔将会和大家探讨set_error_handler的使用。

更多苏南大叔的php相关的经验总结,请点击这里查看:https://newsn.net/tag/php/

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

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

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

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