echo$a;//Notice:Undefinedvariable:a...//E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING不能处理set_error_handler(function($errno,$errstr,$errfile,$errline){echo"HasError:",$errno,',',$errstr,',',$errfile,',',$errline,PHP_EOL;},E_ALL|E_STRICT);echo$a;//HasError:8,Undefinedvariable:a...
set_error_handler() 函数吸收一个回调函数和一个缺点吸收的类型,它的函数署名是:
set_error_handler(callable$error_handler[,int$error_types=E_ALL|E_STRICT]):mixed
$error_handler是一个回调(匿名)函数,这个函数内部可以获取到缺点的等级、信息、文件、行数等
handler(int$errno,string$errstr[,string$errfile[,int$errline[,array$errcontext]]]):bool
个中,$errcontext 已经在 PHP7.2 之后取消了。
\$error_types,用于缺点吸收的类型,就像 error_reporting() 函数定义的缺点类型一样,它用于掌握 $error_handler 回调函数所能吸收的缺点的类型。
须要把稳的是,这个函数无法处理 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 这些类型的缺点,也便是说,能够中断程序实行的缺点它都无法捕获处理。
其余,在函数调用之前的缺点是无法捕获到的,只有在函数调用之后的缺点才能通过这个函数进行捕获处理。
restore_error_handler()这个函数是用于还原之前的缺点处理函数。比如我们在上面代码下添加这个函数,然后再次触发缺点,缺点将会利用回 PHP 的标准处理程序。
restore_error_handler();echo$a;//Notice:Undefinedvariable:a...
set_exception_handler()
学习了上面缺点处理的函数后,从名称就可以看出,这个函数是用来处理非常的,它可以在全局范围内捕获非常。
set_exception_handler(function($ex){echo"HasException:",$ex->getMessage(),PHP_EOL;});thrownewException('InitError');
它的函数署名是:
set_exception_handler(callable$exception_handler):callable
只吸收一个回调函数,回调函数中只有一个参数,是一个 Exception 类型的参数内容,就和 try...catch 中的 catch 块的参数一样。在 PHP7 往后吸收到的是一个 Throwable 类型的参数。也便是说,它可以捕获到所有的缺点和非常。
不过须要把稳的是,在 PHP 中,所有的非常如果不进行处理,都会以中止脚本的缺点形式返回报错信息。以是,在 set_exception_handler() 内处理完之后,脚本会中止运行。纵然后面还有代码。以是,这个函数一样平常会用于全局捕获一些非常、缺点后进行日志记录,它不具有 try...catch 的能力,让非常处理完成后还能连续进行其他操作。
restore_exception_handler()同样的,非常捕获也是可以进行回退的。
set_exception_handler(function($ex){echo"HasExceptionFirst:",$ex->getMessage(),PHP_EOL;});set_exception_handler(function($ex){echo"HasExceptionSecond:",$ex->getMessage(),PHP_EOL;});restore_exception_handler();thrownewException('InitErrorNext');//HasExceptionFirst:InitErrorNext
我们定义了两个 set_exception_handler() 函数,当利用 restore_exception_handler() 后,抛出的非常将会进入到第一个 set_exception_handler() 函数中进行处理。同理,restore_error_handler() 函数如果定义了多个缺点处理,利用 restore_error_handler() 后也会一级一级回退,直到终极利用 PHP 的缺点处理流程进行处理。
trigger_error()末了,我们来看看如何手动抛出一个缺点。就像上面例子中的 throw new Exception() 一样,PHP 也供应了一个用户自定义手动抛出错误的函数。
trigger_error("I'mErrorOne!");//Notice:I'mErrorOne!
它的函数署名是:
trigger_error(string$error_msg[,int$error_type=E_USER_NOTICE]):bool
$error_msg,也便是这个缺点的详细信息,长度限定为 1024 个字节,如果超过了这个长度就会被截断。其余,如果这个信息中包含 HTML 实体标签的话,也不会直接转义,在网页显示时须要利用 htmlentities() 来进行处理。
$error_type参数则是指定报错的级别,默认是 E_USER_NOTICE ,而且它只支持 E_USER... 干系的缺点信息。也便是说,它的参数只能填三个 E_USER_NOTICE 、 E_USER_WARNING 、 E_USER_ERROR 。
当然,我们手动抛出的缺点信息也是可以通过 set_error_handler() 进行捕获的。
set_error_handler(function($errno,$errstr,$errfile,$errline){echo"HasError:",$errno,',',$errstr,',',$errfile,',',$errline,PHP_EOL;},E_ALL|E_STRICT);trigger_error("I'mErrorOne!");//HasError:1024,I'mErrorOne!,...trigger_error("I'mErrorTwo!",E_USER_WARNING);//Has512,I'mErrorOne!,...trigger_error("I'mErrorThree!",E_USER_ERROR);//Has256,I'mErrorOne!,...trigger_error("I'mErrorFour!",E_WARNING);//HasError:2,Invaliderrortypespecified,...
末了一个 trigger_error() 我们利用了 E_WARNING 类型,可以看出直接返回的内容是 指定的缺点类型无效 ,而不是我们定义的内容。也便是说,这里是这个函数的参数类型缺点的报错,不是我们手动想抛出的缺点了。
总结实在 PHP 的缺点处理函数也就这些了,在 PHP7 下面,大部分缺点都可以通过非常捕获了,也便是说,PHP 越向后发展越会通过面向工具的办法来处理这些缺点信息。不过,我们依然还是要对他们有全面的理解,毕竟在 PHP 的版本更新中,短韶光还不会完备的摒弃缺点处理的场景,在之后我们学习详细的非常处理干系的知识时,说不定还会再次见到它们的身影。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/%E4%B8%80%E4%BA%9B%E7%AE%80%E5%8D%95%E7%9A%84%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0%EF%BC%88%E4%BA%8C%EF%BC%89.php
参考文档:
https://www.php.net/manual/zh/function.set-error-handler.php
https://www.php.net/manual/zh/function.set-exception-handler.php
https://www.php.net/manual/zh/function.restore-error-handler.php
https://www.php.net/manual/zh/function.restore-exception-handler.php