Вступление
В сегодняшнем уроке я познакомлю вас с обработкой ошибок и исключений в Yii и проведу вас через некоторые вводные сценарии.
Хотите знать, что такое Yii? Ознакомьтесь с нашим введением в Yii Framework и программирование с помощью серии Yii2 .
В чем разница между ошибками и исключениями?
Ошибки — это неожиданные дефекты в нашем коде, которые часто обнаруживают пользователи. Обычно они нарушают выполнение программы. Важно не только изящно сломаться для пользователя, но и сообщить разработчику о проблеме, чтобы она могла быть исправлена.
Исключения создаются разработчиком при возникновении потенциально предсказуемой ошибки. В коде, где может возникнуть исключение, разработчик может вызвать исключение () для надежного обработчика ошибок.
Как Yii управляет этим?
В Yii нефатальные ошибки PHP (например, предупреждения и уведомления) направляются в поддающиеся отлову исключения, чтобы вы могли решить, как реагировать и реагировать на них. Вы можете назначить действие контроллера для обработки всех этих исключений. И вы можете настроить формат отображения для ошибок, например, HTML, JSON, XML и т. Д.
Исключения и фатальные ошибки PHP могут оцениваться только в режиме отладки. В таких сценариях разработки Yii может отображать подробную информацию о стеке вызовов и сегментах исходного кода (вы можете увидеть это выше на изображении заголовка) .
Фатальные ошибки — это вид событий, которые нарушают выполнение приложения. К ним относятся нехватка памяти, создание экземпляра объекта несуществующего класса или вызов функции, которая не существует.
Например:
1
|
$t = new Unknownobject();
|
Давайте начнем с нескольких примеров обработки ошибок и исключений.
Настройка обработки ошибок и исключений
Сначала мы настраиваем наше приложение в frontend / config / main.php. ErrorHandler определяется как компонент, как показано ниже. Этот пример взят из моего стартап-приложения Meeting Planner . Обратите внимание на конфигурацию errorHandler
в components
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
$params = array_merge(
require(__DIR__ . ‘/params.php’),
require(__DIR__ . ‘/params-local.php’)
);
return [
‘id’ => ‘mp-frontend’,
‘name’ => ‘Meeting Planner’,
‘basePath’ => dirname(__DIR__),
‘bootstrap’ => [‘log’,’\common\components\SiteHelper’],
‘controllerNamespace’ => ‘frontend\controllers’,
‘catchAll’=> [],
‘components’ => [
‘assetManager’ => […],
…
‘errorHandler’ => [
‘errorAction’ => ‘site/error’,
‘maxSourceLines’ => 20,
],
…
],
];
|
В приведенном выше примере errorAction
направляет пользователя к действию ошибки моего SiteController.
В более широком смысле, Yii предлагает множество вариантов конфигурации для errorHandler
для перенаправления и сбора данных:
Свойство | Тип | Описание |
---|---|---|
$ callStackItemView | строка | Путь к файлу представления для отображения исключений и ошибок вызывает элемент стека. например, ‘@ yii / views / errorHandler / callStackItem.php’ |
$ displayVars | массив | Список предопределенных переменных PHP, которые должны отображаться на странице ошибок. например, [‘_GET’, ‘_POST’, ‘_FILES’, ‘_COOKIE’, ‘_SESSION’] |
$ ErrorAction | строка | Маршрут (например, site/error ) к действию контроллера, который будет использоваться для отображения внешних ошибок. |
$ ErrorView | строка | Путь к файлу представления для отображения исключений без информации о стеке вызовов. например, ‘@ yii / views / errorHandler / error.php’ |
$ exceptionView | строка | Путь к файлу представления для отображения исключений. например, ‘@ yii / views / errorHandler / exception.php’ |
$ maxSourceLines | целое число | Максимальное количество строк исходного кода для отображения. |
$ maxTraceSourceLines | целое число | Максимальное количество строк исходного кода трассировки для отображения. |
$ previousExceptionView | строка | Путь к файлу представления для визуализации предыдущих исключений. например, ‘@ yii / views / errorHandler / previousException.php’ |
Использование errorActions для прямого выполнения
Обычно, когда пользователь сталкивается с серьезной ошибкой, мы хотим перенаправить его на понятную страницу с описанием ошибки.
Вот что errorAction
в errorHandler
. Он перенаправляет на actionError нашего SiteController:
1
2
3
4
5
6
7
|
return [
‘components’ => [
‘errorHandler’ => [
‘errorAction’ => ‘site/error’,
],
]
];
|
В нашем SiteController мы определяем явное действие по error
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
namespace app\controllers;
use Yii;
use yii\web\Controller;
class SiteController extends Controller
{
public function actions()
{
return [
‘error’ => [
‘class’ => ‘yii\web\ErrorAction’,
],
];
}
}
|
Вот основной обработчик ошибок (вы можете прочитать больше об этом здесь ):
1
2
3
4
5
6
7
|
public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null) {
return $this->render(‘error’, [‘exception’ => $exception]);
}
}
|
Вы также можете по-разному ответить, есть ли ошибка или нет запроса страницы в вашем приложении:
01
02
03
04
05
06
07
08
09
10
|
public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception instanceof \yii\web\NotFoundHttpException) {
// all non existing controllers+actions will end up here
return $this->render(‘pnf’);
} else {
return $this->render(‘error’, [‘exception’ => $exception]);
}
}
|
Вот мой текущий обработчик ошибок 404 страницы не найден:
Теоретически вы можете включить карту ссылок, предлагаемые страницы, похожие на запрос страницы, функцию поиска и ссылку поддержки контакта на страницах ошибок. Все это может помочь пользователю восстановиться и изящно двигаться дальше.
Вот моя текущая страница общих ошибок (очевидно, у меня есть функции, чтобы добавить) :
Ловить исключения
Если мы хотим отслеживать раздел кода на наличие проблем, мы можем использовать PHP try catch catch . Ниже мы поэкспериментируем с фатальным делением на ноль ошибок:
01
02
03
04
05
06
07
08
09
10
11
12
|
use Yii;
use yii\base\ErrorException;
…
try {
10/0;
} catch (ErrorException $e) {
Yii::warning(«Division by zero.»);
}
…
|
Ответ catch
выше должен генерировать предупреждение для журнала. Yii имеет обширный журнал :
- Yii :: trace () : зарегистрируйте сообщение, чтобы проследить, как работает фрагмент кода. В первую очередь для развития.
- Yii :: info () : записать сообщение, которое передает информацию о событии.
- Yii :: warning () : записать предупреждение о непредвиденном событии
- Yii :: error () : записать фатальную ошибку для расследования
Если вместо регистрации события вы хотите перенаправить пользователя на страницу ошибок, которую мы настроили ранее, вы можете вызвать исключение для события:
1
2
3
|
use yii\web\NotFoundHttpException;
throw new NotFoundHttpException();
|
Вот пример, где мы генерируем исключение с определенным кодом состояния HTTP и настраиваемым сообщением:
1
2
3
4
5
6
7
|
try {
10/0;
} catch (ErrorException $e) {
throw new \yii\web\HttpException(451,
‘Tom McFarlin\’s humor is often lost on me
(and lots of people).’);
}
|
Вот как этот код выглядит для пользователя:
О Yii Logging
Все ошибки в Yii регистрируются в зависимости от того, как вы их настроили. Вы также можете быть заинтересованы в моем уроке о Sentry и Rollbar для входа в Yii:
В заключение
Я надеюсь, вам понравилось наше исследование ошибок и обработки исключений. Следите за будущими уроками в нашей серии «Программирование с Yii2», поскольку мы продолжаем изучать различные аспекты фреймворка.
Если вы хотите глубже погрузиться в разработку приложений Yii, ознакомьтесь с нашей серией «Построение стартапа на PHP», в которой используется расширенный шаблон Yii2. Он рассказывает историю программирования каждого шага Планировщика собраний . Это очень полезно, если вы хотите узнать о создании приложений в Yii с нуля.
Если вы хотите узнать, когда появится следующий учебник по Yii2, следуйте за мной @lookahead_io в Twitter или зайдите на страницу моего инструктора .