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的地方捕捉。