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

一起来了解PHP错误和异常(三)

时间:2023-03-29 16:19:27 PHP

上一篇关于错误和异常的文章,我们来做个总结吧。PHP中错误和异常的区别通过前面两篇文章的学习,我们直接比较错误和异常,看看它们的区别和联系:错误通常是语法或编译运行时错误,这是我们想要避免的。异常一般与业务逻辑有关,基本上是人为抛出的。上层需要处理错误。通知和警告不会中断程序的运行。严重的错误会导致程序立即停止运行。停止运行的程序没有其他方法可以让程序继续运行。异常可以通过try...catch捕获,捕获到的异常可以继续运行。未捕获的异常会直接导致程序停止运行。错误提示与php.ini中的配置有关。尽量不要在线显示错误。尽量不要把错误带到网上。在线错误记录在日志中,尽可能显示开发错误,方便开发者及时调试。PHP7对错误处理的改变PHP7重新定义了一些错误处理方法,使得大部分错误都可以被捕获。并添加了一个Throwable接口,它可以捕获大部分错误和所有异常。也就是说,很多错误都可以被try...catch捕获。不能捕获的基本都是警告错误,可以通过set_exception_handler()注册处理。Error类并没有继承自Exception类,所以如果要全局捕获,最好使用Throwable来捕获。Error和Exception都实现了这个接口。try{test();}catch(Throwable$e){print_r($e);}echo'test()未定义',PHP_EOL;尝试{newPDO();}catch(ArgumentCountError$e){print_r($e);}echo'NoPDOparametergiven',PHP_EOL;functiontest1():int{return'test';}try{test1();}catch(TypeError$e){print_r($e);}echo'返回值类型不正确',PHP_EOL;在上面的示例中,我们捕获了在PHP5中定义为错误的异常。如果不使用try...catch捕获它们,它们在PHP7中仍将被视为错误。我们来看看Throwable下新增的错误异常处理类。ThrowableErrorArithmeticErrorDivisionByZeroErrorAssertionErrorCompileErrorParseErrorTypeErrorArgumentCountErrorException...另外,我们还可以通过全局注册的方式全局处理异常,就是上面说的set_exception_handler()方法。注意,使用这个全局注册异常处理后,异常背后的代码将不会被执行。相当于截断,只记录一条异常日志。set_exception_handler(function($ex){echo'set_exception_handler:',PHP_EOL;print_r($ex);});test();echo'NotExecute...';//不会输出除0之类的错误,经过测试发现仍然抓不到DivisionByZeroError类。如果我们想捕获这样的错误,我们可以使用set_error_handler()获取异常然后抛出错误。set_error_handler(function($errno,$errmsg){if($errmsg=='除以零'){thrownewDivisionByZeroError();}else{thrownewError($errmsg,$errno+10000);}});尝试{100/0;//DivisionByZeroError:DivisionByZeroError对象//echo$f;//错误:code=10008}catch(DivisionByZeroError$e){echo'DivisionByZeroError:';print_r($e);}catch(Error$e){echo'Error';print_r($e);}通过set_error_handler()抛出异常,我们可以捕获这些warning类型的错误,不管是warning还是notice。您可以切换注释以分别查看除以0错误和未定义变量错误抛出的异常。但是,正如我们一直强调的那样,这种错误是可以直接避免的。可以在除法前判断除数,直接抛出异常或返回错误信息。不要让PHP报错。小结通过这三篇文章,可以说我们基本可以清楚地了解PHP中错误和异常的区别、特点和使用场景,并可以针对不同的错误和异常进行相应的处理。当然,其实还有很多相关的内容。以后发现类似内容时,我们将通过单独的文章独立解释。这次先结束整体失误和异常学习。接下来的学习将继续围绕PHP官方文档展开,后续依旧精彩!!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E4%B8%80%E8%B5%B7%E6%90%9E%E6%87%82PHP%E7%9A%84%E9%94%99%E8%AF%AF%E5%92%8C%E5%BC%82%E5%B8%B8%EF%BC%88%E4%B8%89%EF%BC%89.php参考文档:https://www.php.net/manual/zh/language.errors.php7.phphttps://www.php.net/manual/zh/function.set-exception-handler.phphttps://www.php.net/manual/en/class.error.php============各媒体平台均可搜索【硬核项目经理】