zcyxm 2012-05-31 10:18:20 6049次浏览 5条回复 0 0 0

不太懂错误提示 比方说我在地址栏随便写个地址:....index.php?r=site/test,相对应的控制器site里面没有actionTest,就会出现 系统无法找到请求的 "test" 动作. 我想知道这个错误是怎么来的.... 然后我去掉了site控制器内的

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

出现的错误提示就是 CHttpException 系统无法找到请求的 "error" 动作. (C:\AppServ\www\zcyxm\framework\web\CController.php:484)

#0 C:\AppServ\www\zcyxm\framework\web\CController.php(271): CController->missingAction('error')
#1 C:\AppServ\www\zcyxm\framework\web\CWebApplication.php(277): CController->run('error')
#2 C:\AppServ\www\zcyxm\framework\base\CErrorHandler.php(305): CWebApplication->runController('site/error')
#3 C:\AppServ\www\zcyxm\framework\base\CErrorHandler.php(183): CErrorHandler->render('error', Array)
#4 C:\AppServ\www\zcyxm\framework\base\CErrorHandler.php(108): CErrorHandler->handleException(Object(CHttpException))
#5 C:\AppServ\www\zcyxm\framework\base\CApplication.php(713): CErrorHandler->handle(Object(CExceptionEvent))
#6 [internal function]: CApplication::handleException(Object(CHttpException))
#7 {main}

但是呢,我在另外个控制器里面没有写actionError()这个方法,却可以正常的提示 系统无法找到请求的 "test" 动作 ,但是我在控制器的父类里面也没有找到actionError()这个方法。

这个是为什么呢?

  • 回复于 2012-05-31 10:30 举报

    囧,知道了,为什么别的控制器内没写actionError()却可以正常显示了。
    因为配置文件main.php里面指定了,

    'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
    ),
    
  • 回复于 2012-05-31 13:59 举报

    呵呵。。。。刚想回答,看到你已经解决了

  • 回复于 2012-05-31 14:17 举报

    嘿,辛苦了~~

    那就给我说说CHttpException 和 CException 该怎么用。

    我尝试过在controller action中 throw new CHttpException(404,'此页面找不到');
    但是使用CException总是不成功...

  • 回复于 2012-05-31 15:01 举报

    Yii提供了一个完整的,基于PHP5异常处理的错误处理机制。当一个应用开始运行,进行用户请求的处理的时候,会注册handleError 方法来处理PHP warnings和notices信息;同时也注册加handleException方法来处理未被捕获的PHP异常。因此,如果在应用运行期间出现一个 PHP warning/notice 或者一个未捕获的PHP异常,错误处理器就会接过控制权来运行必要的处理机制。

    提示: 错误处理器的注册是在应用中的constructor方法中进行的,使用了PHP函数set_exception_handler
    和set_error_handler。
    如果你不想让Yii来处理错误和异常,你可以在入口文件中定义YII_ENABLE_ERROR_HANDLERYII_ENABLE_EXCEPTION_HANDLER为false.
    默认情况下,在运行onError事件(或onException事件)的时候,errorHandler(或exceptionHandler将被触发。如果错误或者异常未被任何事件处理器来处理,那么就需要运行errorHandler组件来处理了。

    在CApplication应用中 的构造函数
    $this->initSystemHandlers();//初始化错误处理

    protected function initSystemHandlers()
    {
          if(YII_ENABLE_EXCEPTION_HANDLER)//通过该配置关闭异常处理
           set_exception_handler(array($this,'handleException'));
          if(YII_ENABLE_ERROR_HANDLER)//通过该配置关闭错误处理
           set_error_handler(array($this,'handleError'),error_reporting());
    }
    //说明set_exception_handler() 函数设置用户自定义的异常处理函数
    <?php
    function myException($exception)
    {
        echo "<b>Exception:</b> " , $exception->getMessage();
    }
    
    set_exception_handler('myException');
    
    throw new Exception('Uncaught Exception occurred');   //这里是内置异常类Exception。在yii中是CHttpException
    ?>
    

    引发异常
    在Yii中引发异常和在普通PHP文件中没什么两样。你可以使用下面的代码来抛出异常:

    throw new ExceptionClass(‘错误信息’);

    Yii定义了两个异常类:CException和CHttpException。前者是一个通用的异常类,而后者用于对最终用户显示异常信息。同时,后者有一个statusCode属性来代表HTTP状态码。异常的类型决定了显示效果,下面会细说。

    提示: 想要告诉用户某个操作是错误的,那么引发一个CHttpException异常是最简单的方法了。比如说,如果用户在URL中提供了一个无效的ID值,我们可以显示一个404错误:

    // 如果提交的ID是无效的
    throw new CHttpException(404,’此页面不存在’);
    

    显示错误
    当一个错误被转发给组件CErrorHandler的时候,它会选择合适的视图来显示错误。如果这个错误要显示给最终用户的(比如说一个 [CHttpException])那么会使用名为errorXXX的视图来显示错误。这个XXX代表着HTTP错误码(比如说 400,404,500等)。如果这是个内部错误,应该只能被开发者看到,那么将使用的视图名是exception。在后一种中,将会显示完整的调用栈信息和错误行信息。

    当应用运行在生产模式时,所有的错误,包括内部错误都会使用视图errorXXX。这是因为调用的栈信息和错误行信息可能包含一些敏感信息。这种情况下,开发者应该依靠错误日志来确定错误原因。

    CErrorHandler会搜索合适的视图来显示错误信息,搜索的顺序如下:

    `WebRoot/themes/ThemeName/views/system`: 在当前主题视图下的`system`目录中。
    `WebRoot/protected/views/system`: 在应用的默认视图的`system`目录中。
    `yii/framework/views`: 在Yii提供的标准视图目录中。 
    

    因此,如果你想要自定义错误显示,可以直接在system视图目录中或者主题的system视图目录中创建一个视图文件。每个视图文件都是一个包含许多HTML代码的普通PHP文件。参考框架的view目录下的文件,可以获得更多信息。
    使用一个动作来处理错误
    Yii也可以使用控制器/动作来处理错误显示。实现的方法是在应用的配置文件中配置一个错误处理器。

    return array(
        ……
        ‘components’=>array(
        ‘errorHandler’=>array(
        ‘errorAction’=>’site/error’,
        ),
        ),
    );
    

    上面的代码中,我们配置了CErrorHandler::errorAction属性,属性值是一个路由site/error。这个路由指向SiteController中的error。当然,你也可以使用其他的路由。
    我们可以这样来编写error动作:

    public function actionError()
    {
        if($error=Yii::app()->errorHandler->error)
        $this->render(‘error’, $error);
    }
    

    在这个动作中,首先从CErrorHandler::error中取得详细的错误信息。如果取得的信息非空,就使用CErrorHandler::error返回的信息来渲染error视图。CErrorHandler::error返回的信息是一个数组,结构如下:

        `code`: HTTP 状态码(比如 403, 500);
        `type`: 错误类型(比如CHttpException, `PHP Error`);
        `message`: 错误信息;
        `file`: 发生错误的PHP文件名;
        `line`: 错误所在的行;
        `trace`: 错误的调用栈信息;
        `source`: 发生错误的代码的上下文。 
    

    我们检查CErrorHandler::error是否为空的原因是error动作可以被用户访问到,这时候也许并没有什么错误。当我们传递$error数组给视图,它将会被自动释放为独立的变量。所以,在视图中我们可以使用$code$type来访问这些信息。
    消息记录
    一个error级别的错误信息会在错误发生时候被记录。如果这个错误是由PHP warning 或 notice引发的,那么这个消息将会被记录在php这个分类中;如果错误信息是由未捕获的异常所引起的,那么分类将是 exception.ExceptionClassName(对于CHttpException来说,它的statusCode也将被追加到分类名中)。开发者可以使用这些记录来监测应用执行时候的错误信息

    这个是我找到的这两个类的解释,希望对你有帮助

  • 回复于 2012-05-31 16:21 举报

    木有用过呐。。。。。

您需要登录后才可以回复。登录 | 立即注册