Home  >  Article  >  Backend Development  >  Yii Framework Official Guide Series 46 - Special Topic: Error Handling

Yii Framework Official Guide Series 46 - Special Topic: Error Handling

黄舟
黄舟Original
2017-02-16 09:37:441133browse



Yii provides a complete error handling mechanism based on PHP5 exception handling. When an application starts running and handles user requests, the handleError method is registered to handle PHP warnings and notices information; the handleException method is also registered to handle uncaught PHP exceptions. Therefore, if a PHP warning/notice or an uncaught PHP exception occurs while the application is running, the error handler will take over control and run the necessary handling mechanisms.

Tips: The error handler is registered in the constructor method of the application, using the PHP functions set_exception_handler and set_error_handler. If you don't want Yii to handle errors and exceptions, you can define YII_ENABLE_ERROR_HANDLER and YII_ENABLE_EXCEPTION_HANDLER as false in the entry file.

By default, in When the onError event (or onException event) is triggered, the errorHandler (or exceptionHandler) will be triggered. If the error or exception is not handled by any event, then you need to run the errorHandler component to handle it.

1. Raising exceptions

Raising exceptions in Yii is no different from ordinary PHP files. You can use the following code to throw an exception:


throw new ExceptionClass('错误信息');

Yii defines two exception classes: CException and CHttpException . The former is a general exception class, while the latter is used to display exception information to end users. At the same time, the latter has a statusCode attribute to represent the HTTP status code. The type of exception determines the display effect, which will be discussed in detail below.

Tips: If you want to tell the user that a certain operation is wrong, throwing a CHttpException is the easiest way. For example, if the user provides an invalid ID value in the URL, we can display a 404 error:


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

2. Display errors

When an error is forwarded to the component CErrorHandler, it will select the appropriate view to display the error. If the error is to be displayed to the end user (for example, a CHttpException) then a view named errorXXX will be used to display the error. This XXX represents the HTTP error code (such as 400, 404, 500, etc.). If this is an internal error that should only be visible to developers, the view name that will be used is exception. In the latter case, the complete call stack information and error line information will be displayed.

Information: When the application is running in production mode, all errors, including internal errors, will use view errorXXX. This is because the call stack information and error line information may contain some sensitive information. In this case, developers should rely on error logs to determine the cause of the error.

CErrorHandler will search for the appropriate view to display the error message. The search order is as follows:

  1. ##WebRoot/themes/ThemeName/views/system: In the system directory under the current theme view.

  2. WebRoot/protected/views/system: In the system directory of the application's default view.

  3. yii/framework/views: In the standard view directory provided by Yii.

Therefore, if you want to customize the error display, you can create it directly in the

system view directory or the theme's system view directory A view file. Each view file is a regular PHP file containing a lot of HTML code. Refer to the files in the view directory of the framework for more information.

3. Use an action to handle errors

Yii can also use controller actions to handle error display. This is accomplished by configuring an error handler in the application's configuration file.


return array(
    ......
    'components'=>array(
        'errorHandler'=>array(
            'errorAction'=>'site/error',
        ),
    ),
);

In the above code, we configured the CErrorHandler::errorAction attribute, and the attribute value is a route

site/error. This route points to error in SiteController. Of course, you can also use other routes.

We can write the

error action like this:


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

In this In the action, detailed error information is first obtained from CErrorHandler::error. If the obtained information is not empty, use the information returned by CErrorHandler::error to render the

error view. The information returned by CErrorHandler::error is an array with the following structure:

  • code: HTTP status code (such as 403, 500);

  • type: Error type (such as CHttpException, PHP Error);

  • message: Error message;

  • file: The name of the PHP file where the error occurred;

  • line: The line where the error is located;

  • trace: Error call stack information;

  • source : The context of the code where the error occurred.

Tip: The reason why we check whether CErrorHandler::error is empty is that the error action can be accessed by the user. At this time, it may not be possible. Nothing wrong. When we pass the $error array to the view, it will be automatically released as an independent variable. Therefore, in the view we can use $code, $type to access this information.

4. Message recording

An error level error message will be recorded when an error occurs. If the error is caused by a PHP warning or notice, the message will be logged in the php category; if the error message is caused by an uncaught exception, the category will be exception.ExceptionClassName (For CHttpException, its statusCode will also be appended to the class name). Developers can use these records to monitor error messages during application execution

The above is Yii Framework Official Guide Series 46 - Special Topic: Error Handling. For more related content, please pay attention to the PHP Chinese website (www.php .cn)!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn