YII2 全域性異常處理深入講解
首先,我們必須理性認識到,任何一個即使穩定的系統中也是存在著大量的 bug,不管是因為什麼原因導致的錯誤,我們都是需要做好防範的,最好的結果當然是將異常糾正過來,返回客戶端一個正確的響應結果,但絕大多數情況下是沒辦法返回正常結果的,只能返回一個客戶端一個異常的資訊。
處理異常的方式,通常分為:
- 記錄日誌
- 修復異常
- 返回客戶端錯誤
要處理好這個問題http://www.cppcns.com,我認為比較簡單的方式就是將需要處理的異常按照場景先做一個分類。
常用的處理是: 使用者行為導致的錯誤通常不需要記錄日誌,因為若是多人使用的情況下會導致日誌量過大,但需要向客戶端返回具體原因以便使用者用正
程式設計客棧確的方式呼叫我們的介面;而伺服器出現的錯誤則需要記錄日誌,因為我們是需要解決這些錯誤的,記錄日誌讓我們比較方便的找到錯誤的原因,快速解決,但不向客戶端返回具體原因,因為使用者沒辦法通過自己的行為使異常不再出現。當然我們也可以根據自己的業務決定自己的異常處理方式。
在 Thinkphp 或者其他框架中,如果出現異常,則會出現框架的一個異常頁面。
但如果我們開發的是 API,直接返回一個頁面給客戶端顯然不合理,因為別人在使用你的介面的時候還需要解析介面分析出結果,這麼做是十分不合理的,所以,我們需要對框架的異常處理進行重寫。以下使用 Yii2 框架作為例子講解重寫的邏輯:
首先,我們需要找到 Yii 框架異常處理的設定(../config/web.php)
'components' => [ 'errorHandler' => [ 'errorAction' => 'site/error','class' => 'app\common\ExceptionHandler',//(這裡配置我們自己寫的異常處理方法) ],
為了讓我們的程式可以簡單的辨別出客戶的不當呼叫導致的錯誤和伺服器的錯誤,我們可以寫一個客戶的異常類。新建 common\UserException.php 檔案
class UserException extends Exception { // HTTP 狀態碼 404,200 /** * @var int|mixed */ public $code = 400; // 錯誤具體資訊 /** * @var mixed|string */ public $msg = '引數錯誤'; // 自定義的錯誤碼 /** * @var int|mixed */ public $errorCode = 10000; /** * UserException constructor. * @param $params */ public function __construct($params=[]) { // 如果傳過來的不是陣列則不進行物件初始化 mNuNfaCif (!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']; } } }
新建 common/ExceptionHandler.php
檔案,因為 yii 的異常處理的渲染是由 vendor\yiisoft\yii2\web\ErrorHandler.php
中的 renderException
方法渲染的,所以我們開發屬於自己的異常處理類的時候可以選擇繼承該類並重寫這個方法。
這就完程式設計客棧成了全域性的異常處理,讓我們看看效果
當我們開啟 debug 模式時丟擲錯誤:
關閉 dhttp://www.cppcns.comebug 模式,丟擲伺服器端異常:
public function actionIndex() { throw new \Exception(); }
關閉 debug 模式,丟擲客戶端異常:
public function actionIndex() { throw new UserException(); }
到此這篇關於YII2 全域性異常處理深入講解的文章就介紹到這了,更多相關YII2 全域性異常處理內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!