什么是不正常
从更广泛的角度来看,例外包括两个方面。一方面是程序执行过程中语法和运行时错误导致的异常,另一方面是没有给出正确的反馈。比如客户想查询一个产品,找不到,我觉得这也是一个例外。
第一个异常TP框架本身会在页面中输出错误信息,但是第二个异常一般不会输出任何信息,调试起来非常不方便。
本文将详细介绍关于ThinkPHP异常处理的相关内容,并分享给大家参考和学习。下面就不多说了。我们来看看详细的介绍。
前提环境
现在PHP经常为前端提供接口,所以我们的异常处理也是基于这一点。
在开发阶段,TP最初的异常处理是在页面中输出异常信息,可以满足需求,但是在生产环境中,异常需要通过其他方式处理。
本文主要讨论生产环境中的异常处理
面向对象编程
目前,AOP编程思想在很多语言中都非常流行,即面向平面的编程思想。一般来说,是统一处理问题,而不是用同一种方式处理多个问题。对于异常处理,就是定义统一的异常信息,统一处理
总体思路
自定义异常处理类,重写默认异常处理类的呈现方法,然后配置为使用自定义异常处理类来处理所有异常
代码实现
在根目录下创建一个目录异常,并在它下面创建一个Exceptionhandle.php。这个类应该继承句柄类
类异常处理程序扩展句柄创建几个属性来定义异常信息
//http错误代码private $ code//自定义异常信息private $ msg//自定义错误代码private $ errorCode重写句柄类中的呈现方法。当我们通过thrownnewexception()在代码中抛出异常信息时,我们实际上调用了render方法,所以我们必须重写这个方法来返回我们自己的信息
公共函数render(exception $ ex){ return JSON([' msg '='自定义异常信息']);nbsp。}创建新的控制器产品,添加方法并进行测试
公共函数GetProducT($ id){ try { 3/0;} catch(Exception $ ex){ throw $ ex;}}然后添加以下路线
route : get(' product/: id ',' api/v1。product/GetProducT’);输入以下网址测试
http://z.cn/product/2
页面输出如下
可以看出,它不执行自定义异常处理功能。
使用自定义异常处理
在config.php修改以下配置
//将异常处理句柄类留空,使用 think exception handle ' exception _ handle '=' app lib exception exception handler ',然后再次运行
自定义异常处理类
一种类型的异常是由用户行为导致的异常,例如没有找到合格的数据(从另一个角度来看,这不是异常),另一种类型的错误是运行时错误。用户导致的异常有很多种,需要定制相关的类。
首先定义一个父类
Classbase异常扩展了异常{//http状态代码public $ code//错误特定消息public $ msg//自定义错误代码public $ errorCode//构造函数用于接收传入的异常信息,并初始化属性public function _ _ construct($ params){ if(!is _ array($ params)){ return;} if (array_key_exists('code ',$ params)){ $ this-code=$ params[' code '];} if (array_key_exists('msg ',$ params)){ $ this-msg=$ params[' msg '];} if(array _ key _ exists(' error code ',$ params)){ $ this-error code=$ params[' error code '];}}}定义一个异常处理类,用于处理找不到的产品信息,用于重写父类中的所有属性,该类中的属性信息也可能被修改,比如msg
Class productnotfoundexception扩展了baseexception {//http状态代码public $ code=404//错误特定消息public $msg=“请求的产品不存在”;//自定义错误代码public $ errorCode=40000}处理不同的异常
在render方法中,根据不同的异常分别处理异常
//分别处理两种不可接受的异常:1。用户错误2。代码和运行时错误if($ex base exception的实例){} else {}描述:抛出异常时,将执行render函数,并将抛出异常对象复制到参数$ ex,因此可以根据此参数判断异常类型
现在的关键是生产环境,所以希望前端人员能够理解返回的异常信息,而不是像上面那样在页面上输出错误信息,并且包含栈信息。
那么前端和后端人员能够理解的信息一定是json(当然也可以是xml),并修改render方法
if($ ex instance of BaseException){ $ this-code=$ ex-code;$ this-msg=$ ex-msg;$ this-error code=$ ex-error code;} else {//这里是运行时产生的各种异常,所以异常信息无法准确输出,所以只能统一输出服务器错误信息$ this-code=500;$this-msg='服务器内部错误';$ this-error code=999;}然后以json格式返回错误消息
$result=[ 'msg'=$this-msg,' error_code'=$this-errorCode,' request _ URL '=request()-URL()];返回json($result,$ this-code);此时,编写了全局异常处理,并在product.php测试了以下代码
公共函数get product($ id){//处理程序运行时错误/*请尝试{ 3/0;} catch(Exception $ ex){ throw $ ex;} *///处理用户行为导致的错误$error=[ 'msg'='找不到合适的产品'];$ ex=new ProductNotFoundException($ error);抛出$ ex}提示:不要忘记在生产环境中将app_debug修改为false
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。