mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
Error Handling
 | 
						|
==============
 | 
						|
 | 
						|
> Note: This section is under development.
 | 
						|
 | 
						|
Error handling in Yii is different than handling errors in plain PHP. First of all, Yii will convert all non-fatal errors
 | 
						|
to *exceptions*:
 | 
						|
 | 
						|
```php
 | 
						|
use yii\base\ErrorException;
 | 
						|
use Yii;
 | 
						|
 | 
						|
try {
 | 
						|
    10/0;
 | 
						|
} catch (ErrorException $e) {
 | 
						|
    Yii::warning("Tried dividing by zero.");
 | 
						|
}
 | 
						|
 | 
						|
// execution may continue
 | 
						|
```
 | 
						|
 | 
						|
As demonstrated above you may handle errors using `try`-`catch`.
 | 
						|
 | 
						|
Second, even fatal errors in Yii are rendered in a nice way. This means that in debugging mode, you can trace the causes
 | 
						|
of fatal errors in order to more quickly identify the cause of the problem.
 | 
						|
 | 
						|
 | 
						|
Rendering errors in a dedicated controller action
 | 
						|
-------------------------------------------------
 | 
						|
 | 
						|
The default Yii error page is great when developing a site, and is acceptable for production sites if `YII_DEBUG`
 | 
						|
is turned off in your bootstrap `index.php` file. But you may want to customize the default error page to make it
 | 
						|
more suitable for your project.
 | 
						|
 | 
						|
The easiest way to create a custom error page it is to use a dedicated controller action for error rendering. First,
 | 
						|
you'll need to configure the `errorHandler` component in the application's configuration:
 | 
						|
 | 
						|
```php
 | 
						|
// ...
 | 
						|
'components' => [
 | 
						|
    // ...
 | 
						|
    'errorHandler' => [
 | 
						|
        'errorAction' => 'site/error',
 | 
						|
    ],
 | 
						|
]
 | 
						|
```
 | 
						|
 | 
						|
With that configuration in place, whenever an error occurs, Yii will execute the `error`-action of the `site`-controller.
 | 
						|
That action should look for an exception and, if present, render the proper view file, passing along the exception:
 | 
						|
 | 
						|
```php
 | 
						|
public function actionError()
 | 
						|
{
 | 
						|
    $exception = \Yii::$app->errorHandler->exception;
 | 
						|
    if ($exception !== null) {
 | 
						|
        return $this->render('error', ['exception' => $exception]);
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
Next, you would create the `views/site/error.php` file, which would make use of the exception. The exception object has
 | 
						|
the following properties:
 | 
						|
 | 
						|
- `statusCode`: the HTTP status code (e.g. 403, 500). Available for [[yii\web\HttpException|HTTP exceptions]] only.
 | 
						|
- `code`: the code of the exception.
 | 
						|
- `message`: the error message.
 | 
						|
- `file`: the name of the PHP script file where the error occurs.
 | 
						|
- `line`: the line number of the code where the error occurs.
 | 
						|
- `trace`: the call stack of the error.
 | 
						|
 | 
						|
 | 
						|
Rendering errors without a dedicated controller action
 | 
						|
------------------------------------------------------
 | 
						|
 | 
						|
Instead of creating a dedicated action within the Site controller, you could just indicate to Yii what class should
 | 
						|
be used to handle errors:
 | 
						|
 | 
						|
```php
 | 
						|
public function actions()
 | 
						|
{
 | 
						|
    return [
 | 
						|
        'error' => [
 | 
						|
            'class' => 'yii\web\ErrorAction',
 | 
						|
        ],
 | 
						|
    ];
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
After associating the class with the error as in the above, define the `views/site/error.php` file, which will
 | 
						|
automatically be used. The view will be passed three variables:
 | 
						|
 | 
						|
- `$name`: the error name
 | 
						|
- `$message`: the error message
 | 
						|
- `$exception`: the exception being handled
 | 
						|
 | 
						|
The `$exception` object will have the same properties as outlined above.
 |