找不到视图文件时,Yii错误处理程序不起作用

时间:2016-08-30 07:55:49

标签: php yii error-handling

我在我的Yii网站上设置了错误处理程序。

这是代码。

main.php

'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
),

SiteController.php

public function actionError() {
        if ($error = Yii::app()->errorHandler->error) {
            if (Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }

网站/ error.php

<?php
    $this->pageTitle=Yii::app()->name . ' - Error';
    $this->breadcrumbs=array(
        'Error',
    );
?>

<h2>Error <?php echo $code; ?></h2>

<div class="error">
    <?php echo CHtml::encode($message); ?>
</div>

它正常工作并重定向到此自定义错误页面如果URL错误或用户调用错误的功能。 例如,如果在站点控制器中我已设置contact功能,而用户调用此类localhost.com/site/contactsdffe的URL,则会重定向到此自定义错误页面。

但问题出在这里。

如果控制器函数调用了视图联系人,并且我没有设置views / site / contact.php视图,那么它不会被称为此自定义错误页面。 它给了我一个这个异常错误。

  

CException:SiteController无法找到请求的视图“contact”。

我不知道为什么错误处理程序不适用于这种情况,请告诉我如何显示此类错误的自定义错误页面。

任何帮助都会表示赞赏。在此先感谢!

1 个答案:

答案 0 :(得分:2)

使用site/error CException切换到production mode,方法是在输入脚本中将YII_DEBUG设置为false(可能是项目根目录中的index.php)。

要使用自定义例外页面,请将自定义视图exception.php添加到protected/views/system文件夹中。

来自Yii guide page on errors(强调我的):

  

Yii定义了三个异常类:CExceptionCDbExceptionCHttpExceptionCException是一个通用的异常类。 CDbException表示由某些与DB相关的操作引起的异常。 CHttpException表示应向最终用户显示的异常,并带有表示HTTP状态代码的statusCode属性。异常的类决定了它的显示方式,我们将在下面解释。

     

当错误转发到CErrorHandler应用程序组件时,它会选择适当的视图来显示错误。如果要向最终用户显示错误,例如CHttpException,则会使用名为errorXXX的视图,其中XXX代表HTTP状态代码(例如400,404) ,500)。 如果错误是内部错误,并且只应向开发人员显示,则会使用名为exception 的视图。在后一种情况下,将显示完整的调用堆栈以及错误行信息。

     

当应用程序在生产模式下运行时,将使用视图errorXXX显示包括那些内部错误在内的所有错误。这是因为错误的调用堆栈可能包含敏感信息。在这种情况下,开发人员应该依赖错误日志来确定错误的真正原因。

     

CErrorHandler按以下顺序搜索与视图对应的视图文件:

     
      
  • WebRoot/themes/ThemeName/views/system:这是当前活动主题下的系统视图目录。

  •   
  • WebRoot/protected/views/system:这是应用程序的默认系统视图目录。

  •   
  • yii/framework/views:这是Yii框架提供的标准系统视图目录。

  •   

在第一个实例中,Yii在解析url期间抛出CHttpException并返回HTTP状态404.对于第二个实例,url正确解析,因此发生内部错误并且CException扔了。