目录php
程序免不了出错html
以前呢php是报错,你能够设置报错级别,设置错误处理函数编程
如今呢,沿着oop的思路,用异常来替代错误,异常是比错误更加科学和强大的一种处理代码运行错误的一种机制,咱们应该用异常。bash
可是呢,错误并无彻底消失匿迹,咱们本身写的代码当然能够用异常,php也在过渡到异常,可是一些老的函数运行出错仍是会有报错,大概就是这样的状况。app
异常是随着oop编程而出现的,很是适合oop编程里使用,看代码函数
<?php
class Dog{
function eat($food){
if(!is_string($food)){
throw new \Exception('argument must be a string',100);
}
if($food == 'meat'){
return 'i am happy';
}else{
return 'i dont like it';
}
}
}
try{
$dog = new Dog();
$dog->eat(['shit']);
}catch(\Exception $e){
echo $e->getMessage();
}finally{
echo 'we got a exception';
}
//结果是'argument must be a string'
复制代码
异常的使用步骤有 1.抛出异常 2.try catch 捕捉异常和处理异常oop
抛出异常是一个神奇的操做,用throw,会被外层的catch捕捉。 抛出异常后,代码就不执行下去了。ui
try代码块内有抛出异常的话,就会运行catch代码块。spa
Exception类是一个预约义类,抛出异常必须是Exception的实例,接受3个参数,Exception类有好几个方法,经常使用的有getMessage()和getCode().net
在面向对象编程中,一个类每每专一于一个功能,当出现这个类处理不了的错误时,咱们要自觉选择抛出异常,交给上级去处理
咱们在调用没底的类进行使用时,要注意放进try代码块,来作好错误处理
咱们还能够继承Exception编写本身的异常子类,来抛出本身的异常类,catch能够写好几个,这样能够经过类名就知道是什么类型的错误,更加细致得处理不一样的异常
在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();
复制代码
参考文章