Thinkphp5中是如何自定义全局异常

下面给大家讲解thinkphp5中是如何自定义全局异常,希望对需要的朋友有所帮助! 为了针对书写 api 时,对各种错误返回不通的 json ,直接使用 TP5 自带的提示错误页面…

下面给大家讲解thinkphp5中是如何自定义全局异常,希望对需要的朋友有所帮助!

为了针对书写 api 时,对各种错误返回不通的 json ,直接使用 TP5 自带的提示错误页面,对于客户端而言,明显没有任何的作用,所以需要自己来自定义全局异常。

1、创建一个全局异常的类(用于传错误信息,状态码等)

usethink\\Exception;classBaseExceptionextendsException{/**HTTP状态码*@varstring*/public$code;/**自定义错误码*@varstring*/public$errorCode;/**错误信息*@varstring*/public$msg;publicfunction__construct($params=[]){if(!$params){return;}//如果传了codeif($array_key_exists('code',$code){$this->code=$code;}//如果传了errorCodeif(array_key_exists('errorCode',$params)){$this->errorCode=$params['errorCode'];}//如果传了msgif(array_key_exists('msg',$params)){$this->msg=$params['msg'];}}}

这样就可以给以传不通的状态码,错误信息和自定义错误码。

2、创建一个错误处理类

错误处理类,继承于TP5自带的错误处理类,重写该 render 方法,就可以自定义错误。

useException;usethink\\exception\\Handle;usethink\\Request;classExceptionHandleextendsHandle{/**状态码*@var*/private$code;/**自定义错误码*@var*/private$errorCode;/**错误信息*@var*/private$msg;/**重写Handle方法里的Render*@paramException$e*@return\\think\\response\\Json*///注意这里是基类Exceptionpublicfunctionrender(Exception$e){if($einstanceofBaseException){//如果是自定义异常,则控制http状态码,不需要记录日志//因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常//不应当记录日志$this->msg=$e->msg;$this->code=$e->code;$this->errorCode=$e->errorCode;}else{//如果是服务器未处理的异常,将http状态码设置为500,并记录日志if(config('app_debug')){//调试状态下需要显示TP默认的异常页面,因为TP的默认页面//很容易看出问题returnparent::render($e);}$this->code=500;$this->msg='服务器内部错误,不想告诉你';$this->errorCode=999;$this->recordErrorLog($e);}$request=Request::instance();$result=['msg'=>$this->msg,'errorCode'=>$this->errorCode,'request_url'=>$request->url()];returnjson($result,$this->code);}/**错误日志处理*这里把config里日志配置的type改为test*@paramException$e*/privatefunctionrecordErrorLog(Exception$e){//开启日志Log::init(['type'=>'File','path'=>LOG_PATH,'level'=>['error']]);//日志记录方法Log::record($e->getMessage(),'error');}}

3、修改配置config

//异常处理handle类留空使用\\think\\exception\\Handle'exception_handle'=>'app\\lib\\exception\\ExceptionHandle',//关闭日志'log'=>[//日志记录方式,内置filesocket支持扩展//关闭自动记录日志,请将type设置为test'type'=>'test',//日志保存目录'path'=>__DIR__.'/../log/',//日志记录级别'level'=>['sql'],],

4、使用错误类的方法

//这里随便创建一个userControlelrclassUserControllerextendsController{useapp\\api\\model\\User;/***根据id获取某个用户*/publicfunctiongetUser($id){$user=User::get($id);//如果$user为空抛出自定义的错误,下面有…if(!$user){throwUserMissException();}returnjson($user);}}

自定义的错误子类

//上面第一节,写的Base错误类派上用场了。classUserMissExceptionextendsBaseException{/**HTTP状态码*@varstring*/public$code='404';/**自定义错误码*@varstring*/public$errorCode='40000';/**错误信息*@varstring*/public$msg='请求的用户不存在';}

请求这个 getUser 方法,报错~ 就会显示

{"msg":"请求的用户不存在","errorCode":"40000","request_url":"/api/v1/user/10"}

其他的错误类型,也就可以继续创建异常子类,定义这些错误属性。

5、总结

不光是在TP5的框架,包括laravel框架,也是可以自己重新写异常类Exception的render方法,来达到自己想要的错误返回数据或者是页面模版。

产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;

日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉

本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;

部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入

如若转载,请注明出处:https://www.chanpinyuan.cn/42908.html;
(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关推荐

发表回复

登录后才能评论
分享本页
返回顶部