diff --git a/docs/guide/error.md b/docs/guide/error.md index d8e71fd..d5b97d1 100644 --- a/docs/guide/error.md +++ b/docs/guide/error.md @@ -10,7 +10,7 @@ use Yii; try { 10/0; -} catch (ErrorException) { +} catch (ErrorException $e) { Yii::warning("Tried dividing by zero."); } @@ -19,38 +19,39 @@ try { 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 +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 -return [ +// ... +'components' => [ // ... - 'components' => [ - // ... - 'errorHandler' => [ - 'errorAction' => 'site/error', + 'errorHandler' => [ + 'errorAction' => 'site/error', ], +] ``` -With that configuration in place, whenever an error occurs, Yii will execute the "error" action of the "Site" controller. +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() { - if (\Yii::$app->exception !== null) { - return $this->render('error', ['exception' => \Yii::$app->exception]); + $exception = \Yii::$app->errorHandler->exception; + if ($exception !== null) { + return $this->render('error', ['exception' => $exception]); } } ``` @@ -58,14 +59,13 @@ public function actionError() 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 HTTP exceptions only. +- `statusCode`: the HTTP status code (e.g. 403, 500). Available for [[yii\web\HttpException|HTTP exceptions]] only. - `code`: the code of the exception. -- `type`: the error type (e.g. HttpException, PHP Error). - `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. -- `source`: the context source code where the error occurs. + Rendering errors without a dedicated controller action ------------------------------------------------------ @@ -91,4 +91,4 @@ automatically be used. The view will be passed three variables: - `$message`: the error message - `$exception`: the exception being handled -The `$exception` object will have the same properties outlined above. +The `$exception` object will have the same properties as outlined above. diff --git a/framework/base/ErrorHandler.php b/framework/base/ErrorHandler.php index e5b4f9b..82184d1 100644 --- a/framework/base/ErrorHandler.php +++ b/framework/base/ErrorHandler.php @@ -81,11 +81,7 @@ class ErrorHandler extends Component if ($this->discardExistingOutput) { $this->clearOutput(); } - if (PHP_SAPI === 'cli') { - Console::stderr($this->renderException($exception)); - } else { - echo $this->renderException($exception); - } + $this->renderException($exception); if (!YII_ENV_TEST) { exit(1); } @@ -168,11 +164,7 @@ class ErrorHandler extends Component if ($this->discardExistingOutput) { $this->clearOutput(); } - if (PHP_SAPI === 'cli') { - Console::stderr($this->renderException($exception)); - } else { - echo $this->renderException($exception); - } + $this->renderException($exception); exit(1); } } @@ -180,7 +172,6 @@ class ErrorHandler extends Component /** * Renders an exception without using rich format. * @param \Exception $exception the exception to be rendered. - * @return string the rendering result */ protected function renderException($exception) { @@ -202,7 +193,12 @@ class ErrorHandler extends Component } else { $message = $this->formatMessage('Error: ') . $exception->getMessage(); } - return $message . "\n"; + + if (PHP_SAPI === 'cli') { + Console::stderr($message . "\n"); + } else { + echo $message . "\n"; + } } /** @@ -229,7 +225,6 @@ class ErrorHandler extends Component */ protected function logException($exception) { - // TODO logger may not be registered $category = get_class($exception); if ($exception instanceof HttpException) { $category = 'yii\\web\\HttpException:' . $exception->statusCode;