在这里我尝试用最简单易懂的语言为你介绍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还有一些本身的用法,我下篇为你介绍。