7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Programming

Обработка ошибок и исключений в Yii

Read Time: 5 mins

Russian (Pусский) translation by Stanislav Protasevich (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Вступление

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

Не знакомы с Yii? Наверстать упущенное можно, прочитав статью Знакомство с фрэймворком Yii и серию Разработка на базе Yii2.

В чём разница между ошибками и исключениями?

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

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

Как эти процессы протекают в Yii?

В Yii, не фатальные PHP ошибки (заметки и предупреждения) отлавливаются, что даёт возможность должным образом на них среагировать.  Все эти исключения могут направляться на определённый экшен контроллера. Также вы можете повлиять на  формат отображения данных ошибок: HTML, JSON, XML и т.д.

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

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

К примеру:

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

Конфигурация обработчика ошибок и исключений

Для начала нам нужно внести кое-какие записи в файл конфигурации frontend/config/main.php. Как показано ниже, в этом файле определён компонент errorHandler. Данный пример взят из моей серии по организации стартапа Meeting Planner. Взгляните на конфигурацию  errorHandler в разделе components:

В вышеприведённом примере определено, что при возникновении ошибки errorAction направит пользователя на экшен error 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. С этой точки мы и будем направлены на SiteController -> actionError:

Определим экшен error в SiteController:

Вот так вот будет выглядеть обработка ошибки (ссылка на более подробную информацию):

Также вы можете точно определить, возникла ли ошибка или в вашем приложении не существует запрашиваемого маршрута:

Вот мой обработчик ошибки Page Not Found 404:

Yii2 Error Handling and Exceptions 404 Page Not Found ErrorYii2 Error Handling and Exceptions 404 Page Not Found ErrorYii2 Error Handling and Exceptions 404 Page Not Found Error

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

Вот моя страница с отображением ошибки (конечно же над ней нужно ещё работать и работать):

Yii2 Error Handling and Exceptions Typical Page ErrorYii2 Error Handling and Exceptions Typical Page ErrorYii2 Error Handling and Exceptions Typical Page Error

Обработка исключений

Для обработки исключений можем воспользоваться PHP-шной конструкцией try catch. Давайте посмотрим пример в котором разделим число на ноль:

В блоке catch запишем предупреждение в лог. В Yii есть несколько методов логирования:

  • Yii::trace(): сообщение с куском кода. Обычно используется во время разработки.
  • Yii::info(): информационное сообщение.
  • Yii::warning(): предупреждение о каком-то событии.
  • Yii::error(): сообщение о фатальной ошибке.

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

Вот пример в котором мы выбрасываем исключение с определённым  HTTP кодом и специальным сообщением:

А вот что в этом случае увидит пользователь:

Yii2 Error Handling and Exceptions Throw an exceptionYii2 Error Handling and Exceptions Throw an exceptionYii2 Error Handling and Exceptions Throw an exception

О логировании в Yii

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

Заключение

Надеюсь, что мне удалось раскрыть тему, и должным образом показать процесс обработки ошибок и исключений. Следите за обновлениями серии Разработка на базе Yii2, где мы затрагиваем различные аспекты работы с фрэймворком.

Если же вы хотите более глубоко нырнуть в изучении Yii, то советую ознакомиться с серией по Созданию стартапа на PHP, где активно используется компонент шаблонизатора Yii2.  В данной серии описаны все этапы создания сервиса Meeting Planner. Для тех кто только начинает учить Yii — данный материал будет очень полезен.

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

Похожие материалы

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.