YII2 全局異常處理深入講解
首先,我們必須理性認(rèn)識(shí)到,任何一個(gè)即使穩(wěn)定的系統(tǒng)中也是存在著大量的 bug,不管是因?yàn)槭裁丛驅(qū)е碌腻e(cuò)誤,我們都是需要做好防范的,最好的結(jié)果當(dāng)然是將異常糾正過(guò)來(lái),返回客戶(hù)端一個(gè)正確的響應(yīng)結(jié)果,但絕大多數(shù)情況下是沒(méi)辦法返回正常結(jié)果的,只能返回一個(gè)客戶(hù)端一個(gè)異常的信息。
處理異常的方式,通常分為:
- 記錄日志
- 修復(fù)異常
- 返回客戶(hù)端錯(cuò)誤
要處理好這個(gè)問(wèn)題,我認(rèn)為比較簡(jiǎn)單的方式就是將需要處理的異常按照?qǐng)鼍跋茸鲆粋€(gè)分類(lèi)。
常用的處理是: 用戶(hù)行為導(dǎo)致的錯(cuò)誤通常不需要記錄日志,因?yàn)槿羰嵌嗳耸褂玫那闆r下會(huì)導(dǎo)致日志量過(guò)大,但需要向客戶(hù)端返回具體原因以便用戶(hù)用正確的方式調(diào)用我們的接口;而服務(wù)器出現(xiàn)的錯(cuò)誤則需要記錄日志,因?yàn)槲覀兪切枰鉀Q這些錯(cuò)誤的,記錄日志讓我們比較方便的找到錯(cuò)誤的原因,快速解決,但不向客戶(hù)端返回具體原因,因?yàn)橛脩?hù)沒(méi)辦法通過(guò)自己的行為使異常不再出現(xiàn)。當(dāng)然我們也可以根據(jù)自己的業(yè)務(wù)決定自己的異常處理方式。
在 ThinkPHP 或者其他框架中,如果出現(xiàn)異常,則會(huì)出現(xiàn)框架的一個(gè)異常頁(yè)面。
但如果我們開(kāi)發(fā)的是 API,直接返回一個(gè)頁(yè)面給客戶(hù)端顯然不合理,因?yàn)閯e人在使用你的接口的時(shí)候還需要解析界面分析出結(jié)果,這么做是十分不合理的,所以,我們需要對(duì)框架的異常處理進(jìn)行重寫(xiě)。以下使用 Yii2 框架作為例子講解重寫(xiě)的邏輯:
首先,我們需要找到 Yii 框架異常處理的設(shè)置(../config/web.php)
'components' => [ 'errorHandler' => [ 'errorAction' => 'site/error', 'class' => 'app\common\ExceptionHandler',//(這里配置我們自己寫(xiě)的異常處理方法) ],
為了讓我們的程序可以簡(jiǎn)單的辨別出客戶(hù)的不當(dāng)調(diào)用導(dǎo)致的錯(cuò)誤和服務(wù)器的錯(cuò)誤,我們可以寫(xiě)一個(gè)客戶(hù)的異常類(lèi)。新建 common\UserException.php 文件
class UserException extends Exception { // HTTP 狀態(tài)碼 404,200 /** * @var int|mixed */ public $code = 400; // 錯(cuò)誤具體信息 /** * @var mixed|string */ public $msg = '參數(shù)錯(cuò)誤'; // 自定義的錯(cuò)誤碼 /** * @var int|mixed */ public $errorCode = 10000; /** * UserException constructor. * @param $params */ public function __construct($params=[]) { // 如果傳過(guò)來(lái)的不是數(shù)組則不進(jìn)行對(duì)象初始化 if (!is_array($params)) { return; } // 判斷數(shù)組有沒(méi)有該鍵值 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']; } } }
新建 common/ExceptionHandler.php
文件,因?yàn)?yii 的異常處理的渲染是由 vendor\yiisoft\yii2\web\ErrorHandler.php
中的 renderException
方法渲染的,所以我們開(kāi)發(fā)屬于自己的異常處理類(lèi)的時(shí)候可以選擇繼承該類(lèi)并重寫(xiě)這個(gè)方法。
這就完成了全局的異常處理,讓我們看看效果
當(dāng)我們開(kāi)啟 debug 模式時(shí)拋出錯(cuò)誤:
關(guān)閉 debug 模式,拋出服務(wù)器端異常:
public function actionIndex() { throw new \Exception(); }
關(guān)閉 debug 模式,拋出客戶(hù)端異常:
public function actionIndex() { throw new UserException(); }
到此這篇關(guān)于YII2 全局異常處理深入講解的文章就介紹到這了,更多相關(guān)YII2 全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP array_key_exists檢查鍵名或索引是否存在于數(shù)組中的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇PHP array_key_exists檢查鍵名或索引是否存在于數(shù)組中的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06laravel中Redis隊(duì)列監(jiān)聽(tīng)中斷的分析
這篇文章主要給大家介紹了關(guān)于laravel中Redis隊(duì)列監(jiān)聽(tīng)中斷的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09thinkphp的dump函數(shù)無(wú)輸出實(shí)例代碼
下面小編就為大家?guī)?lái)一篇thinkphp的dump函數(shù)無(wú)輸出實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11PHP實(shí)現(xiàn)權(quán)限管理功能示例
下面小編就為大家?guī)?lái)一篇PHP實(shí)現(xiàn)權(quán)限管理功能示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Codeigniter整合Tank Auth權(quán)限類(lèi)庫(kù)詳解
相交其他CodeIgniter的類(lèi)庫(kù),tank_auth,配置簡(jiǎn)單,使用也簡(jiǎn)單,并且作者也一直在更新。這篇文章主要介紹了Codeigniter整合Tank Auth權(quán)限類(lèi)庫(kù)詳解,需要的朋友可以參考下2014-06-06PHP處理SQL腳本文件導(dǎo)入到MySQL的代碼實(shí)例
通常在制作安裝程式,數(shù)據(jù)備份程序的時(shí)候會(huì)要用到這樣的代碼,我看網(wǎng)上有是有不太多,而且有些也不是很好用,有時(shí)候這種代碼直接用現(xiàn)成的可以節(jié)省很多時(shí)間,那么我就從stackoverflow轉(zhuǎn)了一個(gè)過(guò)來(lái),需要的朋友可以參考下2014-03-03解決在laravel中auth建立時(shí)候遇到的問(wèn)題
今天小編就為大家分享一篇解決在laravel中auth建立時(shí)候遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10