Spec-Zone.ru › Yii 2.0

Обработка ошибок

  1. Использование обработчика ошибок
  2. Настройка отображения ошибок

Yii включает встроенный обработчик ошибок, который делает обработку ошибок намного приятнее, чем раньше. В частности, обработчик ошибок Yii выполняет следующее для улучшения обработки ошибок:

  • Все некритичные ошибки PHP (например, предупреждения, уведомления) преобразуются в перехватываемые исключения.
  • Исключения и фатальные ошибки PHP отображаются с подробной информацией о стеке вызовов и строках исходного кода в режиме отладки.
  • Поддерживает использование специального действия контроллера для отображения ошибок.
  • Поддерживает различные форматы ответов об ошибках.

Обработчик ошибок включен по умолчанию. Вы можете отключить его, определив константу YII_ENABLE_ERROR_HANDLER как false в скрипте входа вашего приложения.

Использование обработчика ошибок

Обработчик ошибок зарегистрирован как компонент приложения с именем errorHandler. Вы можете настроить его в конфигурации приложения следующим образом:

return [
    'components' => [
        'errorHandler' => [
            'maxSourceLines' => 20,
        ],
    ],
];

С указанной выше конфигурацией количество строк исходного кода, отображаемых на страницах исключений, будет до 20.

Как уже упоминалось, обработчик ошибок превращает все некритичные ошибки PHP в перехватываемые исключения. Это означает, что вы можете использовать следующий код для обработки ошибок PHP:

use Yii;
use yii\base\ErrorException;

try {
    10/0;
} catch (ErrorException $e) {
    Yii::warning("Division by zero.");
}

// execution continues...

Если вы хотите показать страницу с ошибкой, сообщая пользователю, что его запрос недействителен или неожиданный, вы можете просто бросить HTTP-исключение, такое как yii\web\NotFoundHttpException. Обработчик ошибок правильно установит код HTTP-статуса ответа и использует соответствующий вид для отображения сообщения об ошибке.

use yii\web\NotFoundHttpException;

throw new NotFoundHttpException();

Настройка отображения ошибок

Обработчик ошибок настраивает отображение ошибок в зависимости от значения константы YII_DEBUG. Когда YII_DEBUG равно true (то есть в режиме отладки), обработчик ошибок будет отображать исключения с подробной информацией о стеке вызовов и строках исходного кода для более удобной отладки. А когда YII_DEBUG равно false, будет отображаться только сообщение об ошибке, чтобы предотвратить раскрытие конфиденциальной информации о приложении.

Информация: Если исключение является потомком yii\base\UserException, стек вызовов не будет отображаться независимо от значения YII_DEBUG. Это потому, что такие исключения считаются возникшими по вине пользователя, и разработчикам не нужно ничего исправлять.

По умолчанию обработчик ошибок отображает ошибки, используя два вида:

  • @yii/views/errorHandler/error.php: используется, когда ошибки должны отображаться БЕЗ информации о стеке вызовов. Когда YII_DEBUG равно false, это единственный отображаемый вид ошибки.
  • @yii/views/errorHandler/exception.php: используется, когда ошибки должны отображаться С информацией о стеке вызовов.

Вы можете настроить свойства errorView и exceptionView обработчика ошибок для использования собственных представлений для настройки отображения ошибок.

Использование действий ошибок

Лучший способ настроить отображение ошибок — использовать специальные действия ошибок. Для этого сначала настройте свойство errorAction компонента errorHandler следующим образом:

return [
    'components' => [
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
    ]
];

Свойство errorAction принимает маршрут к действию. Вышеприведенная настройка указывает, что при отображении ошибки без информации о стеке вызовов должно выполняться действие site/error.

Вы можете создать действие site/error следующим образом,

namespace app\controllers;

use Yii;
use yii\web\Controller;

class SiteController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
}

Этот код определяет действие error, используя класс yii\web\ErrorAction, который отображает ошибку с помощью представления с именем error.

Помимо использования yii\web\ErrorAction, вы также можете определить действие error с помощью метода действия следующим образом,

public function actionError()
{
    $exception = Yii::$app->errorHandler->exception;
    if ($exception !== null) {
        return $this->render('error', ['exception' => $exception]);
    }
}

Теперь вам необходимо создать файл представления, расположенный по адресу views/site/error.php. В этом файле представления вы можете получить доступ к следующим переменным, если действие ошибки определено как yii\web\ErrorAction:

  • name: имя ошибки;
  • message: сообщение об ошибке;
  • exception: объект исключения, с помощью которого вы можете получить более полезную информацию, например, код HTTP-статуса, код ошибки, стек вызовов ошибки и т. д.

Информация: Если вы используете шаблон базового проекта или шаблон расширенного проекта, действие ошибки и представление ошибки уже определены для вас.

Примечание: Если вам нужно перенаправить в обработчике ошибок, сделайте это следующим образом:

Yii::$app->getResponse()->redirect($url)->send();
return;

Настройка формата ответа об ошибке

Обработчик ошибок отображает ошибки в соответствии с параметром формата ответа. Если формат ответа ответа равен html, он будет использовать представление об ошибке или исключении для отображения ошибок, как описано в последнем подраздёле. Для других форматов ответов обработчик ошибок назначит массивное представление исключения свойству yii\web\Response::$data, которое затем будет преобразовано в различные форматы соответственно. Например, если формат ответа равен json, вы можете увидеть следующий ответ:

HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

{
    "name": "Not Found Exception",
    "message": "The requested resource was not found.",
    "code": 0,
    "status": 404
}

Вы можете настроить формат ответа об ошибке, ответив на событие beforeSend компонента response в конфигурации приложения:

return [
    // ...
    'components' => [
        'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                if ($response->data !== null) {
                    $response->data = [
                        'success' => $response->isSuccessful,
                        'data' => $response->data,
                    ];
                    $response->statusCode = 200;
                }
            },
        ],
    ],
];

Вышеуказанный код переформатирует ответ об ошибке следующим образом:

HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

{
    "success": false,
    "data": {
        "name": "Not Found Exception",
        "message": "The requested resource was not found.",
        "code": 0,
        "status": 404
    }
}

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-runtime-handling-errors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API