В каждом ответе Http-протокола существует некий 3-х значный код. Он позволяет клиенту правильно трактовать полученный результат. Думаю всем веб-мастерам хорошо известен код «404 — Not found». Кодов на самом деле огромное множество, все они описаны в спецификации Http протокола. Но знать все не обязательно. Главное при создании Exception (исключения) выбрать правильную группу кодов ответа. Групп всего 5:
К ошибкам клиента относятся обращения к несуществующей странице, к запрещенной странице, неправильные параметры запроса, вызов не существующего метода, слишком большое количество запросов.
К серверным ошибкам относятся внутренние ошибки сервера, недоступность сервиса или отсутствие поддержки данной версии протокола.
Из всего вышесказанного становится понятно, что разработчику для корректной обработки ошибок нужны коды из 4 группы.
Зачем вообще нужны Exception? Для того, чтобы в случаи неожиданной ошибки, приложение могло сообщить о том, что его работа прекращена по такой-то причине. Exception можно отлавливать и обрабатывать, например с помощью конструкции try catch.
В Yii2 есть класс \yii\web\HttpException с помощью которого можно создать любое исключение.
throw new HttpException(404 ,'User not found');
Так же существуют классы со звучными именами для наиболее часто используемых типов ошибок, благодаря которым вам не нужно запоминать код ответа.
Все они отнаследованы от \yii\web\HttpException и не нуждаются указании кода ответа.
throw new NotFoundHttpException('User not found');
Установить статус ответа можно и с помощью метода setStatusCode() класса yii\web\Response
Yii::$app->response->setStatusCode(422);
Это удобно тогда, когда есть необходимость передать что-либо в теле ответа.
Корректность обработки 404-ошибки
Спасибо большое за обзорчик.
А не подскажите какое бросить исключение, так чтобы задать свой текст ошибки? Я отлавиливаю ВСЕ исключения в небольшом коде и кидаю:
} catch (\Exception $e) {
$transaction->rollBack();
// throw $e;
throw new ErrorException(‘asd!!!’);
}
Хендлер что-то там отлавливает и вывоит просто:
Ошибка
Возникла внутренняя ошибка сервера.
А где моё ‘asd!!!’ ??? =(
В конфиге в компонентах указан экшен, который выводит все эксепшены по умолчанию:
По умолчанию это site/error — именно он отвечает за то, как будет выглядеть страница ошибки. Вы можете задать свою страницу или просто поменять шаблоны для этих страниц
Сейчас ваша строка ‘asd!!!’ это message у эксепшена (см класс yii/web/ErrorHandler) и он должен выводится на странице, но не в качестве заголовка или единственного сообщения. Если же этого текста нет совсем — значит ошибка произошла где-то в другом месте или при попытке обработать экспешен. Нужно включить development режим и искать ошибку. Надеюсь это помогло.
Спасибо большое!
Регулярно захожу на эту страницу)