目录
- 错误和异常概念
- 异常
- 异常类
- 抛出
- 捕捉
- 使用原则
- 全局设置
- 错误
错误和异常
程序免不了出错
之前呢php是报错,你可以设置报错级别,设置错误处理函数
现在呢,沿着oop的思路,用异常来替代错误,异常是比错误更加科学和强大的一种处理代码运行错误的一种机制,我们应该用异常。
但是呢,错误并没有完全消失匿迹,我们自己写的代码固然可以用异常,php也在过渡到异常,但是一些老的函数运行出错还是会有报错,大概就是这样的情况。
异常
异常是随着oop编程而出现的,非常适合oop编程里使用,看代码
eat(['shit']);}catch(\Exception $e){ echo $e->getMessage();}finally{ echo 'we got a exception';}//结果是'argument must be a string'复制代码
异常的使用步骤有 1.抛出异常 2.try catch 捕捉异常和处理异常
抛出异常
抛出异常是一个神奇的操作,用throw,会被外层的catch捕捉。 抛出异常后,代码就不执行下去了。
捕捉异常
try代码块内有抛出异常的话,就会运行catch代码块。
异常类
Exception类是一个预定义类,抛出异常必须是Exception的实例,接受3个参数,Exception类有好几个方法,常用的有getMessage()和getCode()
异常机制的使用
单一职责的类,将超出处理范围的错误抛出
在面向对象编程中,一个类往往专注于一个功能,当出现这个类处理不了的错误时,我们要自觉选择抛出异常,交给上级去处理
调用类时,要设置try catch
我们在调用没底的类进行使用时,要注意放进try代码块,来做好错误处理
扩展Exception
我们还可以继承Exception编写自己的异常子类,来抛出自己的异常类,catch可以写好几个,这样可以通过类名就知道是什么类型的错误,更加细致得处理不同的异常
finally
在catch后面接finally,finally里面的代码怎样都会运行一遍
全局异常处理
我们不可能把所有的代码都放在try代码块,万一有漏网之鱼的异常,就惨了,怎么办? 我们可以设置一个全局的处理函数作为后备,当没有代码能catch异常时,交给这个函数处理。
这个设置方法就是这样
set_exception_handler(function(\Exception $e){ echo 'haha,sth is wrong,but i wont tell you the detail,you can go and check log file';});throw new \Exception();复制代码
错误
错误时完全不一样的机制,他没有太细致的处理选项,比异常有多一个预定的错误等级。
全局错误处理程序
跟异常一样,我们也可以设置一个函数用于处理所有没有被处理的错误。
set_error_handler(function($errno,$errstr,$errfile,$errline){ echo 'haha,sth is wrong,but i wont tell you the detail,you can go and check log file';});trigger_error();复制代码
我们可以巧妙得把错误转发成一个异常,这样并入异常处理机制统一处理
set_error_handler(function($errno,$errstr,$errfile,$errline){ throw new \Exception($errstr,$errno); });trigger_error();复制代码
参考文章