当前位置: 首页 > 后端技术 > PHP

一些简单的错误处理函数(二)

时间:2023-03-29 19:18:57 PHP

接下来我们继续学习PHP中的错误处理函数。上次学习的函数是错误信息的获取、设置、发送等函数。今天的学习内容主要是错误捕获相关的函数。set_error_handler()首先是大家可能接触过的一个函数,它可以用来捕获一些错误信息。如果我们需要统一处理一些错误,比如指定日志格式或者发送错误信息到邮件,我们通常会在入口文件的开头定义一个全局作用域的函数来统一处理。回声$a;//注意:未定义的变量: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);回声$a;//HasError:8,Undefinedvariable:a...set_error_handler()函数接收回调函数和错误接收类型,其函数签名为:set_error_handler(callable$error_handler[,int$error_types=E_ALL|E_STRICT]):mixed$error_handler是一个回调(Anonymous)函数,可以获取这个函数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()学习了上面的错误处理函数,从名字就可以看出这个函数是用来处理异常的,可以在全局Catch异常中使用。set_exception_handler(function($ex){echo"HasException:",$ex->getMessage(),PHP_EOL;});thrownewException('初始化错误');其函数签名为:set_exception_handler(callable$exception_handler):callable只接受一个回调函数,回调函数中只有一个参数,为Exception类型的参数内容,与catch块的参数相同在尝试...抓住。PHP7之后接收的是一个Throwable类型的参数。也就是说,它捕获所有错误和异常。但是需要注意的是,在PHP中,如果所有的异常都没有被处理,会以error的形式返回一个终止脚本的错误信息。因此,在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()函数定义了多个errorhandler,则在使用restore_error_handler()后会逐级回滚,直到最后使用PHP的错误处理流程进行处理。trigger_error()最后,让我们看看如何手动抛出错误。就像上面例子中的thrownewException()一样,PHP也提供了一个用户自定义的函数来手动抛出错误。trigger_error("我是错误一!");//注意:我是错误一!它的函数签名是:trigger_error(string$error_msg[,int$error_type=E_USER_NOTICE]):bool$error_msg,就是这个error的具体信息,长度限制在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"有错误:",$errno,',',$errstr,',',$errfile,',',$errline,PHP_EOL;},E_ALL|E_STRICT);trigger_error("我是错误一!");//有错误:1024,我是错误一!,...trigger_error(“我是错误二!”,E_USER_WARNING);//有512,我是错误一!,...trigger_error("我是错误三!",E_USER_ERROR);//有256,我是错误一!,...trigger_error(“我是错误四!”,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.phphttps://www.php.net/manual/zh/function.set-exception-handler.phphttps://www.php.net/manual/zh/function.restore-error-handler.phphttps://www.php.net/manual/zh/function.restore-exception-handler.php各个媒体平台都可以搜索【硬核项目经理】