一文講解thinkphp5中是如何自定義全局異常

下面thinkphp框架教程欄目將給大家講解thinkphp5中是如何自定義全局異常,希望對需要的朋友有所幫助!

為了針對書寫 api 時,對各種錯誤返回不通的 json ,直接使用 TP5 自帶的提示錯誤頁面,對于客戶端而言,明顯沒有任何的作用,所以需要自己來自定義全局異常。

1.創建一個全局異常的類(用于傳錯誤信息,狀態碼等)

use?thinkException; class?BaseException?extends?Exception?{ ????/**?HTTP?狀態碼 ?????*?@var?string ?????*/ ????public?$code; ???? ????/**?自定義錯誤碼 ?????*?@var?string ?????*/ ????public?$errorCode; ???? ????/**?錯誤信息 ?????*?@var?string ?????*/ ????public?$msg; ???? ????public?function?__construct($params=[]) ????{ ????????if?(!?$params)?{ ????????????return?; ????????} ???????? ????????//?如果傳了?code ????????if?($array_key_exists('code',?$code)?{ ????????????$this->code?=?$code; ????????} ???????? ????????//?如果傳了?errorCode ????????if?(array_key_exists('errorCode',?$params))?{ ????????????$this->errorCode?=?$params['errorCode']; ????????} ????????//?如果傳了?msg ????????if?(array_key_exists('msg',?$params))?{ ????????????$this->msg?=?$params['msg']; ????????} ????} }

這樣就可以給以傳不通的狀態碼,錯誤信息和自定義錯誤碼。

2. 創建一個錯誤處理類

立即學習PHP免費學習筆記(深入)”;

錯誤處理類,繼承于TP5自帶的錯誤處理類,重寫該 render 方法,就可以自定義錯誤。

use?Exception; use?thinkexceptionHandle; use?thinkRequest; class?ExceptionHandle?extends?Handle? { ????/**?狀態碼 ?????*?@var ?????*/ ????private?$code; ????/**?自定義錯誤碼 ?????*?@var ?????*/ ????private?$errorCode; ????/**?錯誤信息 ?????*?@var ?????*/ ????private?$msg; ???? ????/**?重寫?Handle?方法里的Render ?????*?@param?Exception?$e ?????*?@return?thinkresponseJson ?????*/ ????????????//?注意這里是基類?Exception ????public?function?render(Exception?$e)? ????{ ????????if?($e?instanceof?BaseException)?{ ????????????//如果是自定義異常,則控制http狀態碼,不需要記錄日志 ????????????//因為這些通常是因為客戶端傳遞參數錯誤或者是用戶請求造成的異常 ????????????//不應當記錄日志 ????????????$this->msg?=?$e->msg; ????????????$this->code?=?$e->code; ????????????$this->errorCode?=?$e->errorCode; ????????}?else?{ ????????????//?如果是服務器未處理的異常,將http狀態碼設置為500,并記錄日志 ????????????if?(config('app_debug'))?{ ????????????????//?調試狀態下需要顯示TP默認的異常頁面,因為TP的默認頁面 ????????????????//?很容易看出問題 ????????????????return?parent::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() ????????]; ????????return?json($result,?$this->code); ????} ???? ????/**?錯誤日志處理 ?????*??這里把config里日志配置的type改為test ?????*?@param?Exception?$e ?????*/ ????private?function?recordErrorLog(Exception?$e) ????{ ????????//?開啟日志 ????????Log::init([ ????????????'type'??=>??'File', ????????????'path'??=>??LOG_PATH, ????????????'level'?=>?['error'] ????????]); ???????? ????????//?日志記錄方法 ????????Log::record($e->getMessage(),'error'); ????} ???? }

3.修改配置config

//?異常處理handle類?留空使用?thinkexceptionHandle ????'exception_handle'???????=>?'applibexceptionExceptionHandle', ???? //?關閉日志???? 'log'????????????????????=>?[ ????????//?日志記錄方式,內置?file?socket?支持擴展 ????????//?關閉自動記錄日志,請將type設置為test ????????'type'??=>?'test', ????????//?日志保存目錄 ????????'path'??=>?__DIR__.'/../log/', ????????//?日志記錄級別 ????????'level'?=>?['sql'], ????],

4.使用錯誤類的方法

//?這里隨便創建一個userControlelr class?UserController?extends?Controller?{ ????use?appapimodelUser; ???? ????/** ????*?根據?id?獲取某個用戶 ????*/ ????public?function?getUser($id) ????{ ????????$user?=?User::get($id); ???????? ????????//?如果?$user?為空?拋出自定義的錯誤,下面有... ????????if(!?$user)?{ ????????????throw?UserMissException(); ????????} ???????? ????????return?json($user); ????} }

自定義的錯誤子類

//?上面第一節,寫的?Base?錯誤類派上用場了。? class?UserMissException?extends?BaseException { ????/**?HTTP?狀態碼 ?????*?@var?string ?????*/ ????public?$code?=?'404'; ????/**?自定義錯誤碼 ?????*?@var?string ?????*/ ????public?$errorCode?=?'40000'; ????/**?錯誤信息 ?????*?@var?string ?????*/ ????public?$msg?=?'請求的用戶不存在'; }

請求這個 getUser 方法,報錯~? 就會顯示

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

其他的錯誤類型,也就可以繼續創建異常子類,定義這些錯誤屬性。

5.總結

不光是在TP5的框架,包括laravel框架,也是可以自己重新寫異常類Exception的render方法,來達到自己想要的錯誤返回數據或者是頁面模版。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享