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还有一些本身的用法,我下篇为你介绍。

相关文章
相关标签/搜索