php异常处理机制

转自:https://www.cnblogs.com/water0729/p/5802476.html

php异常我们常接触到的就是error错误码1,warning错误码2,notice错误码8这三类。出现error了系统是挂掉了,但是warning和notice是我们可以捕捉并处理的

 

php配置项
display_errors=On On将错误显示到浏览器上,不管是On还是Off都会记录到你错误日志里面,前提是配置了错误日志log_errors和error_log

error_reporting 设置错误报告级别,这个与display_errors和error_log有关,只会将对应的错误记录在错误日志或者打印到浏览器上


php错误处理机制
php本身有一套错误处理机制,就是通过display_errors error_reporting来控制
所以默认情况下,在代码出现问题,notice warning等消息时,会直接打印到浏览器上,而且还会继续往下执行,这个时候你通过 try catch根本捕捉不到,这就和我理解的不太一样,
因为我以为的会是错误直接被我catch捕捉到,

所以php的try catch 能捕捉到的只能是你自己 throw new Exception("");的错误,throw之后的语句会进入到catch中继续执行。

如果你想抛弃php自身的错误处理机制,这个时候可以通过set_error_handler这个函数,自定义一个函数用来处理,再这个函数中你可以抛出异常,然后再通过catch捕捉到异常。


这样的意义就是,当出现notice和warning时,比如在mysql连接失败时,会出现warning,但是这个warning你又不能直接通过catch捕捉到,不考虑关闭display_errors,
然后设置error_reporting,通过判断connect返回的句柄,来手动throw抛出异常

 

set_error_handler()也不能用来处理所有的错误级别,官方手册上是这样说的:

The following error types cannot be handled with a user defined function: 
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, 
and most of E_STRICT raised in the file where set_error_handler() is called.

 

最后再提供一个小技巧,对于需要使用第三方类的时候可以考虑这样子

 

1.通过__call()方法,这样做的好处就是避免了,再使用没有定义的方法的时候,会报error的错误,error是会让整个系统挂掉的。

2.第二个方面配合set_error_handler()方法设置的自定义错误处理函数,就相当于在调用函数方法的过程中就已经封装了异常处理,我们只需要判断函数处理结果是false(或者是其他的一个字符串)就好了。可以用来判断函数是否调用失败,比如connect。

 

还有一点需要注意的是,php throw出来的异常,必须要catch到,不然会报错。php的异常也像JAVA的异常的一样,可以在最外层catch捕捉,也可以在throw的地方捕捉。

posted @   夏秋初  阅读(146)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示