您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何在ThinkPHP中對(duì)異常進(jìn)行處理,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
什么是異常
從更加廣泛的角度來(lái)看,異常包含兩個(gè)方面,一方面是程序執(zhí)行時(shí)由于語(yǔ)法、運(yùn)行時(shí)錯(cuò)誤等導(dǎo)致的異常,一方面時(shí)沒(méi)有給予正確的反饋,如客戶端要查詢某個(gè)產(chǎn)品,沒(méi)有查詢到,我認(rèn)為這也屬于異常的一種。
第一種異常TP框架本身會(huì)在頁(yè)面中輸出錯(cuò)誤信息,但是第二種異常則一般不會(huì)輸出任何信息,所以非常不方便調(diào)試。
本文將詳細(xì)介紹關(guān)于ThinkPHP異常處理的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
前提環(huán)境
現(xiàn)在 PHP 在很多時(shí)候是為前端提供接口,所以我們的異常處理也基于這一點(diǎn)進(jìn)行處理。
在開發(fā)階段,TP 原有的異常處理是在頁(yè)面中輸出異常信息,這一點(diǎn)能夠滿足需求,但在生產(chǎn)環(huán)境中,則需要以其他方式處理異常。
本文都是針對(duì)生產(chǎn)環(huán)境的異常處理
AOP 編程
現(xiàn)在在很多語(yǔ)言中,都非常流行 AOP 編程思想,即面向切面編程思想,通俗的說(shuō),就是用統(tǒng)一的方式處理問(wèn)題,而不是用相同的方式分別處理多個(gè)問(wèn)題,對(duì)于異常處理來(lái)說(shuō),就是定義統(tǒng)一的異常信息,用統(tǒng)一的方式處理
大致思路
自定義異常處理類,重寫默認(rèn)異常處理類的 render 方法,然后配置使用自定義異常處理類處理所有異常
代碼實(shí)現(xiàn)
在根目錄下創(chuàng)建目錄 exception,在其下創(chuàng)建ExceptionHandle.php,此類要繼承 handle 類
class ExceptionHandler extends Handle
創(chuàng)建幾個(gè)屬性,用于定義異常信息
// http 錯(cuò)誤碼 private $code; // 自定義異常信息 private $msg; // 自定義錯(cuò)誤碼 private $errorCode;
覆蓋 Handle 類中的render 方法,當(dāng)我們?cè)诖a中使用 throw new Exception() 方式拋出異常信息時(shí),其實(shí)就是調(diào)用了 render 方法,所以我們要重寫此方法,以返回我們自己的信息
public function render(Exception $ex) { return json(['msg'=>"自定義異常信息"]); nbsp; }
下面新建控制器 Product,添加方法,進(jìn)行測(cè)試
public function getProduct($id) { try{ 3/0; } catch(Exception $ex){ throw $ex; } }
然后添加如下路由
Route::get("product/:id","api/v1.Product/getProduct");
輸入如下url 測(cè)試
http://z.cn/product/2
頁(yè)面輸出結(jié)果如下
可見(jiàn),其并沒(méi)有執(zhí)行自定義異常處理函數(shù)。
使用自定義的異常處理
在 config.php 中修改如下配置
// 異常處理handle類 留空使用 \think\exception\Handle 'exception_handle' => 'app\lib\exception\ExceptionHandler',
然后再運(yùn)行
自定義異常處理類
一類異常是用戶行為導(dǎo)致的異常,比如沒(méi)有查詢到符合條件的數(shù)據(jù)(從另一個(gè)角度來(lái)說(shuō),這其實(shí)不算異常),一類錯(cuò)誤是運(yùn)行時(shí)錯(cuò)誤。而用戶導(dǎo)致的異??赡芊譃楹芏喾N,所以需要自定義相關(guān)的類。
首先定義一個(gè)父類
class BaseException extends Exception { //http 狀態(tài)碼 public $code; //錯(cuò)誤具體消息 public $msg; //自定義錯(cuò)誤碼 public $errorCode; //構(gòu)造函數(shù)用于接收傳入的異常信息,并初始化類中的屬性 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('errorCode', $params)) { $this->errorCode = $params['errorCode']; } } }
再定義一個(gè)處理找不到產(chǎn)品信息的異常處理類,用來(lái)重寫父類中的各個(gè)屬性,而且這個(gè)類中的屬性信息也可能會(huì)被修改,如 msg
class ProductNotFoundException extends BaseException { //http 狀態(tài)碼 public $code = 404; //錯(cuò)誤具體消息 public $msg = "請(qǐng)求的產(chǎn)品不存在"; //自定義錯(cuò)誤碼 public $errorCode = 40000; }
處理不同異常
在 render 方法中,根據(jù)異常的不同分別處理
//分別處理兩種不容類型異常:1、用戶錯(cuò)誤 2.代碼與運(yùn)行時(shí)錯(cuò)誤 if ($ex instanceof BaseException) { } else { }
說(shuō)明:在 throw 異常時(shí),會(huì)執(zhí)行 render 函數(shù),同時(shí)會(huì)將拋出的異常對(duì)象復(fù)制給參數(shù) $ex,所以可以根據(jù)此參數(shù)判斷異常類型
現(xiàn)在的關(guān)鍵是生產(chǎn)環(huán)境,所以希望返回的異常信息,前端人員能夠看懂,而不是像上面那樣在頁(yè)面中輸出錯(cuò)誤信息,還包括堆棧信息等。
那么前前端賀后端人員都能夠看懂的信息一定是 json(當(dāng)然也可以是xml)了,修改 render 方法
if ($ex instanceof BaseException) { $this->code = $ex->code; $this->msg = $ex->msg; $this->errorCode = $ex->errorCode; } else { //這里是在運(yùn)行時(shí)產(chǎn)生的各種異常,所以無(wú)法準(zhǔn)確輸出異常信息,所以只能統(tǒng)一輸出是服務(wù)器錯(cuò)誤信息 $this->code = 500; $this->msg = "服務(wù)器內(nèi)部錯(cuò)誤"; $this->errorCode = 999; }
然后以 json 格式返回錯(cuò)誤信息
$result = [ 'msg' => $this->msg, 'error_code' => $this->errorCode, 'request_url' => request()->url() ]; return json($result,$this->code);
至此,全局的異常處理就編寫好了,下面在 product.php 中編碼進(jìn)行測(cè)試
public function getProduct($id) { //處理程序運(yùn)行時(shí)錯(cuò)誤 /*try{ 3/0; } catch(Exception $ex){ throw $ex; }*/ //處理用戶行為產(chǎn)生的錯(cuò)誤 $error=[ 'msg'=>'沒(méi)有找到合適的產(chǎn)品' ]; $ex=new ProductNotFoundException($error); throw $ex; }
提示:生產(chǎn)環(huán)境不要忘了將 app_debug 修改為 false
上述就是小編為大家分享的如何在ThinkPHP中對(duì)異常進(jìn)行處理了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。