Виды HttpException в Yii2

1 июня, 2015
Метки:

В каждом ответе Http-протокола существует некий 3-х значный код. Он позволяет клиенту правильно трактовать полученный результат. Думаю всем веб-мастерам хорошо известен код «404 — Not found». Кодов на самом деле огромное множество, все они описаны в спецификации Http протокола. Но знать все не обязательно. Главное при создании Exception (исключения) выбрать правильную группу кодов ответа. Групп всего 5:

  • 1xx Информационные сообщения
  • 2xx Успешное выполнение запроса
  • 3xx Перенаправления (редирект)
  • 4xx Ошибки клиента
  • 5xx Ошибка на сервере

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

HttpException в Yii2

Зачем вообще нужны Exception? Для того, чтобы в случаи неожиданной ошибки, приложение могло сообщить о том, что его работа прекращена по такой-то причине. Exception можно отлавливать и обрабатывать, например с помощью конструкции try catch.
В Yii2 есть класс \yii\web\HttpException с помощью которого можно создать любое исключение.

 throw new HttpException(404 ,'User not found');

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

  • BadRequestHttpException — 400 ошибка
  • UnauthorizedHttpException — 401 ошибка
  • ForbiddenHttpException — 403 ошибка
  • NotFoundHttpException — 404 ошибка
  • MethodNotAllowedHttpException — 405 ошибка
  • NotAcceptableHttpException — 406 ошибка
  • ConflictHttpException — 409 ошибка
  • GoneHttpException — 410 ошибка
  • UnsupportedMediaTypeHttpException — 415 ошибка
  • TooManyRequestsHttpException — 429 ошибка
  • ServerErrorHttpException — 500 ошибка

Все они отнаследованы от \yii\web\HttpException и не нуждаются указании кода ответа.

 throw new NotFoundHttpException('User not found');

Установить статус ответа можно и с помощью метода setStatusCode() класса yii\web\Response

Yii::$app->response->setStatusCode(422);

Это удобно тогда, когда есть необходимость передать что-либо в теле ответа.


Метки:

Оставить комментарий

5 комментариев »

    Гость

    Корректность обработки 404-ошибки


    Артём

    Спасибо большое за обзорчик.


    Максим

    А не подскажите какое бросить исключение, так чтобы задать свой текст ошибки? Я отлавиливаю ВСЕ исключения в небольшом коде и кидаю:
    } catch (\Exception $e) {
    $transaction->rollBack();
    // throw $e;
    throw new ErrorException(‘asd!!!’);
    }
    Хендлер что-то там отлавливает и вывоит просто:

    Ошибка
    Возникла внутренняя ошибка сервера.

    А где моё ‘asd!!!’ ??? =(

      Developer

      В конфиге в компонентах указан экшен, который выводит все эксепшены по умолчанию:

        'errorHandler' => [
                  'errorAction' => 'site/error',
              ],
      

      По умолчанию это site/error — именно он отвечает за то, как будет выглядеть страница ошибки. Вы можете задать свою страницу или просто поменять шаблоны для этих страниц

      //значения по умолчанию
      'errorView' => '@yii/views/errorHandler/error.php',
      'exceptionView' => '@yii/views/errorHandler/exception.php' 
      

      Сейчас ваша строка ‘asd!!!’ это message у эксепшена (см класс yii/web/ErrorHandler) и он должен выводится на странице, но не в качестве заголовка или единственного сообщения. Если же этого текста нет совсем — значит ошибка произошла где-то в другом месте или при попытке обработать экспешен. Нужно включить development режим и искать ошибку. Надеюсь это помогло.


    Александр Булатов

    Спасибо большое!
    Регулярно захожу на эту страницу)


Оставить комментарий:









Копирование материалов разрешено при наличии активной ссылки на источник