Статьи

Как обрабатывать ошибки и исключения в Yii Framework

Конечный продукт
Что вы будете создавать

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

Хотите знать, что такое Yii? Ознакомьтесь с нашим введением в Yii Framework и программирование с помощью серии Yii2 .

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

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

В 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’

Обычно, когда пользователь сталкивается с серьезной ошибкой, мы хотим перенаправить его на понятную страницу с описанием ошибки.

Вот что 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 страницы не найден:

Обработка ошибок Yii2 и исключения 404 Страница не найдена

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

Вот моя текущая страница общих ошибок (очевидно, у меня есть функции, чтобы добавить) :

Yii2 Обработка ошибок и исключения Типичная ошибка страницы

Если мы хотим отслеживать раздел кода на наличие проблем, мы можем использовать 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).’);
   }

Вот как этот код выглядит для пользователя:

Yii2 Обработка ошибок и исключения Бросьте исключение

Все ошибки в Yii регистрируются в зависимости от того, как вы их настроили. Вы также можете быть заинтересованы в моем уроке о Sentry и Rollbar для входа в Yii:

  • Создание вашего стартапа: регистрация ошибок

Я надеюсь, вам понравилось наше исследование ошибок и обработки исключений. Следите за будущими уроками в нашей серии «Программирование с Yii2», поскольку мы продолжаем изучать различные аспекты фреймворка.

Если вы хотите глубже погрузиться в разработку приложений Yii, ознакомьтесь с нашей серией «Построение стартапа на PHP», в которой используется расширенный шаблон Yii2. Он рассказывает историю программирования каждого шага Планировщика собраний . Это очень полезно, если вы хотите узнать о создании приложений в Yii с нуля.

Если вы хотите узнать, когда появится следующий учебник по Yii2, следуйте за мной @lookahead_io в Twitter или зайдите на страницу моего инструктора .