在 Yii2 使用中,我們發現一但程序出現錯誤,Yii2 就能自動顯示其專用的錯誤提示界面,和我們寫原生態時出現的錯誤提示界面完全不一樣。
它究竟是怎么做到的呢:是在哪里設置監聽的?亦或在哪里用的try catch?”。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (推薦學習:yii框架)
其實 PHP 有自己專用的錯誤處理 API, 當程序出現問題時,可以自動調用指定函數。而 Yii2 正是利用這一點,在其啟動的時候,使用 PHP 內置的 set_error_handler 將自己的錯誤處理注冊進步并關閉 PHP 自身的錯誤顯示。
Yii2 錯誤自定義處理
在 官方教程 中,它告訴我們要開啟自定義的錯誤,需要進行如下配置組件:
return?[ ????//?... ???? ????'components'?=>?[ ????????//?... ???????? ????????'errorHandler'?=>?[ ????????????'errorAction'?=>?'site/error', ????????], ????] ???? ????//?... ];
Yii2 錯誤核心處理方法
在 Yii2 錯誤自定義處理 中我們了解了 Yii2 錯誤注冊的原理并知道錯誤的發生后,Yii2 將調用 yiiwebErrorHandler 類對象的 handleException 和 handleError 方法。
其實 yiiwebErrorHandler 類中并沒有 handleException 和 handleError 方法,但是在其基類 yiibaseErrorHandler 有,這兩個函數最終都將調用 yiiwebErrorHandler 的 renderException 方法,代碼如下:
#?yiiwebErrorHandler /** ?*?Renders?the?exception. ?*?@param?Exception?$exception?the?exception?to?be?rendered. ?*/ protected?function?renderException($exception) { ????//?... ????//?注意:控制錯誤是否能自定義的關鍵 ????//?!YII_DEBUG?表示了如果你現在是在?Debug?模式下,那么不能自定義錯誤 ????//?即使你配置了組件的?'errorHandler'?=>?['errorAction'?=>?'site/error']?參數 ????$useErrorView?=?$response->format?===?Response::FORMAT_HTML?&&?(!YII_DEBUG?||?$exception?instanceof?UserException); ????//?傳遞到自定義錯誤處理方法 ????if?($useErrorView?&&?$this->errorAction?!==?null)?{ ????????$result?=?Yii::$app->runAction($this->errorAction); ????????if?($result?instanceof?Response)?{ ????????????$response?=?$result; ????????}?else?{ ????????????$response->data?=?$result; ????????} ????} ???? ????//?... }
在最終的錯誤顯示方法?renderException?我們可以看出:自定義的錯誤需要在非 DEBUG 模式下才能生效
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END