在這裏我嘗試用最簡單易懂的語言爲你介紹yii2中關於錯誤處理的那些事情。php
在yii2中錯誤處理是以組件的形式存在,經過調用 Yii::$app->errorHandler 能夠得到這個對象,咱們先來看一下這個對象的內容。web
$handler = Yii::$app->errorHandler;
VarDumper::dump($handler,10,true);
複製代碼
輸出結果yii2
yii\web\ErrorHandler#1
(
[maxSourceLines] => 19
[maxTraceSourceLines] => 13
[errorAction] => 'site/error'
[errorView] => '@app/views/site/err.php'
[exceptionView] => '@app/views/site/err.php'
[callStackItemView] => '@yii/views/errorHandler/callStackItem.php'
[previousExceptionView] => '@yii/views/errorHandler/previousException.php'
[displayVars] => [
0 => '_GET'
1 => '_POST'
2 => '_FILES'
3 => '_COOKIE'
4 => '_SESSION'
]
[discardExistingOutput] => true
[memoryReserveSize] => 262144
[exception] => null
[yii\base\ErrorHandler:_memoryReserve] => 'xxxxx'
[yii\base\ErrorHandler:_hhvmException] => null
[yii\base\Component:_events] => []
[yii\base\Component:_behaviors] => null
)
複製代碼
在這裏咱們看到有諸如 errorAction / errorView / exceptionView 等屬性,正是這些屬性控制着yii2中各種錯誤輸出,固然做爲組件咱們也能夠在components對其配置,就像下面同樣。app
'errorHandler' => [
'errorAction' => 'site/error',
],
複製代碼
事實上在yii2中全部組件的公共屬性咱們均可以像上面同樣去配置。yii
接下來經過不一樣的場景來講明如何使用errorHandler函數
這種狀況咱們常常遇到,好比用戶輸入了一個錯誤的url,都會致使報錯。優化
默認狀況是這樣的。url
默認狀況下這個文件是/views/site/error.php,經過web.php的以下代碼來配置spa
'errorHandler' => [
'errorAction' => 'site/error',
],
複製代碼
能夠經過修改errorAction更改,在你配置的視圖裏可使用message,分別表明報錯的名字和信息。code
值得注意的是這個報錯信息僅僅在YII_DEBUG=true的狀況下才會出現,若是YII_DEBUG=false,則顯示默認的An internal server error occurred。
好比咱們的action內查詢了一個數據表,可是該數據表並不存在,這個時候的報錯yii2是如何處理的那?問題比較複雜,咱們從兩個方面說明。
當你不處在YII_DEBUG模式下而且在web.php指定了errorAction的狀況下,錯誤的顯示仍是由errorAction值來接管。
好比以下配置
//index.php
defined('YII_DEBUG') or define('YII_DEBUG', false);
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
],
複製代碼
你會獲得相似這樣的結果。
若是我沒有在web.php中指定errorAction那?
若是你沒有指定,則yii2會啓動vendor/yiisoft/yii2/views/errorHandler/error.php擔任顯示工做,你會看到以下的顯示效果。
通常來講在生產環境咱們都配置本身的errorAction視圖來優化用戶體驗。
固然在咱們開發階段,上面的錯誤輸出是不夠的,咱們須要知道是哪一個文件哪行報了什麼具體的錯誤,所以在YII_DEBUG=true就算你設置了errorAction,當程序出現內部錯誤的時候,依然會出現詳細的信息,以下圖這樣。
你看到的顯示結果是由vendor/yiisoft/yii2/views/errorHandler/exception.php負責。
咱們在生產環境配置errorAction能夠增長用戶體驗,可是你可惡的老闆須要你在開發階段也有本身公司風格的顯示,那你如何作那?
雖然這個需求用處不大可是咱們依然能夠配置它。
//web.php
'errorHandler' => [
'errorAction' => 'site/error',
'errorView' => '',
'exceptionView' => ''
],
複製代碼
指定errorView & exceptionView,仍是咱們說的那句話,對於組件驅動類的公共屬性通常都是能夠配置的。另外若是你作了一個yii2的擴展,也許這些配置是有用處的。
errorHandler還有一些其餘的配置,它們可讓你作出更符合你的輸出。
這兩個參數主要用於開發階段錯誤信息源碼顯示行數,爲了更好的說明咱們先看下面的圖
當一個錯誤信息發生的時候,上圖1處表明最終這個錯誤的爆發點 而下面的每行表示它的運行路徑。
maxSourceLines表明1處相關源碼顯示行數
maxTraceSourceLines 表明相似2這種相關文件關聯處的源碼顯示行數
默認狀況下maxSourceLines=19,maxTraceSourceLines=13。
配置方法
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'maxSourceLines'=>2,
'maxTraceSourceLines' => 2
],
複製代碼
在上圖咱們看到了一個錯誤發生時通過了不少文件和函數,可能你想知道這每一行是如何顯示出來的,callStackItemView就是每一行的視圖,默認爲vendor/yiisoft/yii2/views/errorHandler/callStackItem.php,你也能夠配置它。
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'callStackItemView'=>'xxx'
],
複製代碼
這是一個頗有意思的配置項,你可能歷來沒注意過它,先看看真身。
什麼意思那?返回異常鏈中的前一個異常.
這個配置項使用了php原生的Exception::getPrevious,好比咱們上圖的前一個異常是PDO的報錯。
詳情能夠去 previousExceptionView默認配置項 vendor/yiisoft/yii2/views/errorHandler/previousException.php 中去看已看,固然它也是能夠配置的,雖然沒什麼必要。
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'previousExceptionView'=>'xxx'
],
複製代碼
默認顯示 '_GET', '_POST', '_FILES', '_COOKIE', '_SESSION' 五種類型,你能夠在報錯信息的底部看到它,如圖
記住這個配置使用了$GLOBALS。
咱們能夠經過配置減小一些顯示,好比只顯示$_GET
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'displayVars'=>['_GET']
],
複製代碼
預留內存,防止內存異常的時候錯誤處理器不能處理錯誤,默認是262144(256KB),用x做爲佔位符。若是設置爲0則爲不預留。
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'memoryReserveSize'=>262144
],
複製代碼
默認爲真,處理異常時中斷全部輸出。固然你能夠關閉它。
// web.php
'errorHandler' => [
'errorAction' => 'site/error',
'discardExistingOutput'=>262144
],
複製代碼
以上就是關於errorHandler全部配置項,固然errorHandler還有一些本身的用法,我下篇爲你介紹。