宝哥软件园

ThinkPHP中异常处理的详细说明

编辑:宝哥软件园 来源:互联网 时间:2021-08-31

什么是不正常

从更广泛的角度来看,例外包括两个方面。一方面是程序执行过程中语法和运行时错误导致的异常,另一方面是没有给出正确的反馈。比如客户想查询一个产品,找不到,我觉得这也是一个例外。

第一个异常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

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+