也便是说,很多缺点可以通过try...catch进行捕获了。
而无法捕获的基本上是警告类的缺点,这些缺点可以通过 set_exception_handler() 进行注册处理。

Error 类不是继续自 Exception 类,以是想全局捕获的话最好还是利用 Throwable 来进行捕获,不管是 Error 还是 Exception 都实现了这个接口。

try{test();}catch(Throwable$e){print_r($e);}echo'未定义test()',PHP_EOL;try{newPDO();}catch(ArgumentCountError$e){print_r($e);}echo'没给PDO参数',PHP_EOL;functiontest1():int{return'test';}try{test1();}catch(TypeError$e){print_r($e);}echo'返回值类型禁绝确',PHP_EOL;

上面的例子中我们捕获了在PHP5中被定义为缺点的非常
如果不该用try...catch进行捕获的话,它们在PHP7中依然会被当做缺点来对待。
我们来看看 Throwable 下面都有哪些新增加的缺点非常处理类。

phperrorcode一路搞懂PHP的毛病和异常三 CSS

Throwable

Error ArithmeticError DivisionByZeroError AssertionErrorCompileError ParseError TypeError ArgumentCountErrorException ...

其余我们还可以通过全局注册来对非常进行全局处理,也便是上面所说的 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=='Divisionbyzero'){thrownewDivisionByZeroError();}else{thrownewError($errmsg,$errno+10000);}});try{100/0;//DivisionByZeroError:DivisionByZeroErrorObject//echo$f;//Error:code=10008}catch(DivisionByZeroError$e){echo'DivisionByZeroError:';print_r($e);}catch(Error$e){echo'Error';print_r($e);}

通过 set_error_handler() 抛出非常,我们就可以捕获这些警告类型的缺点了,不管是 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.php https://www.php.net/manual/zh/function.set-exception-handler.php https://www.php.net/manual/en/class.error.php