错误处理

    默认情况下,在触发onError事件(或事件)的时候,errorHandler(或)将被触发。如果错误或者异常未被任何事件所处理,那么就需要运行errorHandler组件来处理了。

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

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

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

    • WebRoot/protected/views/system: 在应用的默认视图的system目录中。

    • yii/framework/views: 在Yii提供的标准视图目录中。

    因此,如果你想要自定义错误显示,可以直接在system视图目录中或者主题的视图目录中创建一个视图文件。每个视图文件都是一个包含许多HTML代码的普通PHP文件。参考框架的view目录下的文件,可以获得更多信息。

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

    我们可以这样来编写error动作:

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

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

    一个error级别的错误信息会在错误发生时候被记录。如果这个错误是由PHP warning 或 notice引发的,那么这个消息将会被记录在php这个分类中;如果错误信息是由未捕获的异常所引起的,那么分类将是exception.ExceptionClassName(对于来说,它的statusCode也将被追加到分类名中)。开发者可以使用这些来监测应用执行时候的错误信息