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

Php 找不到视图文件时,Yii错误处理程序不工作,php,yii,error-handling,Php,Yii,Error Handling,我已经在我的Yii站点中设置了错误处理程序 这是代码 main.php 'errorHandler'=>array( // use 'site/error' action to display errors 'errorAction'=>'site/error', ), public function actionError() { if ($error = Yii::app()->errorHandler->error)

我已经在我的Yii站点中设置了错误处理程序

这是代码

main.php

'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
),
public function actionError() {
        if ($error = Yii::app()->errorHandler->error) {
            if (Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }
<?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>
SiteController.php

'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
),
public function actionError() {
        if ($error = Yii::app()->errorHandler->error) {
            if (Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }
<?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>
site/error.php

'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
),
public function actionError() {
        if ($error = Yii::app()->errorHandler->error) {
            if (Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }
<?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错误或用户调用错误的函数,它工作正常并重定向到此自定义错误页面。 例如,如果在site controller中我设置了
contact
功能,并且用户像这样调用URL
localhost.com/site/contactsdffe
,那么它将重定向到此自定义错误页面

但问题就在这里。

如果控制器函数调用view contact,而我还没有设置views/site/contact.php视图,那么它就不会被称为这个自定义错误页面。 它给了我一个异常错误的提示

CEException:SiteController找不到请求的视图“联系人”

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


任何帮助都将不胜感激。提前谢谢

要使用
site/error
进行
ceexception
切换,请在输入脚本中将
YII_DEBUG
设置为false(可能是项目根目录中的
index.php

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

从(我的)重点:

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

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

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

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

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

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

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

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