Обработка ошибок
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