yii2配置詞典 / 靈活的errorHandler伴你前行

在這裏我嘗試用最簡單易懂的語言爲你介紹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函數

action寫錯了

這種狀況咱們常常遇到,好比用戶輸入了一個錯誤的url,都會致使報錯。優化

默認狀況是這樣的。url

alt

默認狀況下這個文件是/views/site/error.php,經過web.php的以下代碼來配置spa

'errorHandler' => [
    'errorAction' => 'site/error',
],
複製代碼

能夠經過修改errorAction更改,在你配置的視圖裏可使用name和message,分別表明報錯的名字和信息。code

值得注意的是這個報錯信息僅僅在YII_DEBUG=true的狀況下才會出現,若是YII_DEBUG=false,則顯示默認的An internal server error occurred。

程序內部報錯了

好比咱們的action內查詢了一個數據表,可是該數據表並不存在,這個時候的報錯yii2是如何處理的那?問題比較複雜,咱們從兩個方面說明。

YII_DEBUG=false

當你不處在YII_DEBUG模式下而且在web.php指定了errorAction的狀況下,錯誤的顯示仍是由errorAction值來接管。

好比以下配置

//index.php
defined('YII_DEBUG') or define('YII_DEBUG', false);
// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
],
複製代碼

你會獲得相似這樣的結果。

alt

若是我沒有在web.php中指定errorAction那?

若是你沒有指定,則yii2會啓動vendor/yiisoft/yii2/views/errorHandler/error.php擔任顯示工做,你會看到以下的顯示效果。

alt

通常來講在生產環境咱們都配置本身的errorAction視圖來優化用戶體驗。

YII_DEBUG=true

固然在咱們開發階段,上面的錯誤輸出是不夠的,咱們須要知道是哪一個文件哪行報了什麼具體的錯誤,所以在YII_DEBUG=true就算你設置了errorAction,當程序出現內部錯誤的時候,依然會出現詳細的信息,以下圖這樣。

alt

你看到的顯示結果是由vendor/yiisoft/yii2/views/errorHandler/exception.php負責。

一個不必的配置

咱們在生產環境配置errorAction能夠增長用戶體驗,可是你可惡的老闆須要你在開發階段也有本身公司風格的顯示,那你如何作那?

雖然這個需求用處不大可是咱們依然能夠配置它。

//web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'errorView' => '',
    'exceptionView' => ''
],
複製代碼

指定errorView & exceptionView,仍是咱們說的那句話,對於組件驅動類的公共屬性通常都是能夠配置的。另外若是你作了一個yii2的擴展,也許這些配置是有用處的。

一些其餘配置

errorHandler還有一些其餘的配置,它們可讓你作出更符合你的輸出。

maxSourceLines & maxTraceSourceLines

這兩個參數主要用於開發階段錯誤信息源碼顯示行數,爲了更好的說明咱們先看下面的圖

alt

當一個錯誤信息發生的時候,上圖1處表明最終這個錯誤的爆發點 而下面的每行表示它的運行路徑。

maxSourceLines表明1處相關源碼顯示行數

maxTraceSourceLines 表明相似2這種相關文件關聯處的源碼顯示行數

默認狀況下maxSourceLines=19,maxTraceSourceLines=13。

配置方法

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'maxSourceLines'=>2,
    'maxTraceSourceLines' => 2
],
複製代碼

callStackItemView

在上圖咱們看到了一個錯誤發生時通過了不少文件和函數,可能你想知道這每一行是如何顯示出來的,callStackItemView就是每一行的視圖,默認爲vendor/yiisoft/yii2/views/errorHandler/callStackItem.php,你也能夠配置它。

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'callStackItemView'=>'xxx'
],
複製代碼

previousExceptionView

這是一個頗有意思的配置項,你可能歷來沒注意過它,先看看真身。

alt

什麼意思那?返回異常鏈中的前一個異常.

這個配置項使用了php原生的Exception::getPrevious,好比咱們上圖的前一個異常是PDO的報錯。

詳情能夠去 previousExceptionView默認配置項 vendor/yiisoft/yii2/views/errorHandler/previousException.php 中去看已看,固然它也是能夠配置的,雖然沒什麼必要。

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'previousExceptionView'=>'xxx'
],
複製代碼

displayVars

默認顯示 '_GET', '_POST', '_FILES', '_COOKIE', '_SESSION' 五種類型,你能夠在報錯信息的底部看到它,如圖

alt

記住這個配置使用了$GLOBALS。

咱們能夠經過配置減小一些顯示,好比只顯示$_GET

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'displayVars'=>['_GET']
],
複製代碼

memoryReserveSize

預留內存,防止內存異常的時候錯誤處理器不能處理錯誤,默認是262144(256KB),用x做爲佔位符。若是設置爲0則爲不預留。

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'memoryReserveSize'=>262144
],
複製代碼

discardExistingOutput

默認爲真,處理異常時中斷全部輸出。固然你能夠關閉它。

// web.php
'errorHandler' => [
    'errorAction' => 'site/error',
    'discardExistingOutput'=>262144
],
複製代碼

小結

以上就是關於errorHandler全部配置項,固然errorHandler還有一些本身的用法,我下篇爲你介紹。

相關文章
相關標籤/搜索