我在我的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”。
我不知道为什么错误处理程序不适用于这种情况,请告诉我如何显示此类错误的自定义错误页面。
任何帮助都会表示赞赏。在此先感谢!
答案 0 :(得分:2)
使用site/error
CException
切换到production mode,方法是在输入脚本中将YII_DEBUG
设置为false(可能是项目根目录中的index.php
)。
要使用自定义例外页面,请将自定义视图exception.php
添加到protected/views/system
文件夹中。
来自Yii guide page on errors(强调我的):
Yii定义了三个异常类:
CException
,CDbException
和CHttpException
。CException
是一个通用的异常类。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
扔了。