к чему относится Exception в MVC?

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я сегодня придумал коварный вопрос для собеседования, и решил обсудить с вами заодно

в парадигме MVC к чему относится Exception - это модель, представление или контроллер?
 

AmdY

Пью пиво
Команда форума
Это хороший вопрос на опыт работы с юнит тестами, а то многие теоретики не догадываются о проблеме с ловлей стандартного исключения.
Ну о по MVC это вопрос на поразмышлять, так как его может бросать один компонент логики, а ловить и знать - другой.
 

Ragazzo

TDD interested
AmdY
это вопрос из серии "какую чушь еще спросить, чтобы соискатель на место программиста подумал что я крут".
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
на самом деле это не чушь, этот вопрос появился из рабочего обсуждения сегодня в команде о том где в приложении ловить исключения из RPC-компонента, где готовить сообщение для лога и где вызывать запись в лог,

вопрос совсем не праздный, в разных местах надо делать обработку по-разному: если исключение появилось в ходе работы приложения - надо выдавать 500 Internal Server Error,
если в ходе работе виджета - только "ошибка компонента", а страница в целом должна отрисоваться нормально,
виджет у меня - субконтроллер, который дергает модели и выводит по шаблону
 

itprog

Cruftsman
Это хороший вопрос на опыт работы с юнит тестами
юнит тесты то тут при чем? Учитывая, что исключения это больше try/catch конструкции, то это то же самое, что спрашивать "циклы/условные операторы - где это в mvc?"

Очевидно, что ловить надо там, где нужно, независимо от MVC.

вопрос совсем не праздный, в разных местах надо делать обработку по-разному
И что мешает? Наверняка же есть хелпер для вызова виджета, в нем можно и использовать catch.
 
  • Like
Реакции: Gas

Absinthe

жожо
флоппик а это фреймворковский фронт-контроллер сам сделает, мы в него не лезем.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
мое мнение такое:

Exception - это обычный встроенный класс, как DateTime, это никакая не конструкция языка, просто класс, и он должен встраиваться в MVC,
throw - оператор вызова, с тем отличием, что вызов не добавляется в стек, как при вызове функции, а идет обратно по стеку вызовов,
catch - специальный синтаксис языка, подобный функции с заданным типом параметра, наследником Exception

Exception не обрабатывает действия пользователя и работает одинаково в любом контексте, это не контроллер,
не содержит информацию о форматировании вывода, это не View,
содержит данные об ошибке - это или внешние данные, или данные из логика приложения, но не содержит обработки данных,
это анемичная модель или Value Transfer Object

когда мы бросаем, например, CHttpException в yii - мы "вызываем" системный контроллер, передаем ему параметр CHttpException с текстом ошибки и кодом HTTP статуса, а он вызывает view, который отрисовывает страницу ошибки по шаблону и модели
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
из понимания сути становится понятен способ применения: ловить надо или в однородной же сущности, или в контроллере,
исключение, которое бросили из модели, надо ловить или в модели, или в контроллере, но не во view.
в лог удобнее писать в контроллере - именно там прописывается логика, которая зависит от контекста,
в модели удобно поймать исключение драйвера и бросить новое, которое будет обрабатывать контроллер
 

Beavis

Banned
Очевидно же, что исключения надо делить на уровни.
На уровне модели свои исключения, на уровне контроллера свои.
На счет представления не знаю, если туда можно как-то умудриться их запихнуть, почему бы и нет.

Модель бросает исключение типа ItemNotFoundException extends ModelException, контроллер ловит это, и выкидывает исключение на своем уровне, типа Error404Exception extends ControllerException.
 

Ragazzo

TDD interested
Absinthe
В представлении вызывается виджет/хелпер/etc который если что может бросить эксепшен Http, что в этом такого?
 

MiksIr

miksir@home:~$
А это... класс, который осуществляет заполнение переданных из контроллеров данных и исполнение шаблонов - это часть view или нет? ;)
 

MiksIr

miksir@home:~$
Нет, вспомнил работы на лимбе. Там приходящий запрос проходил через цепочку фильтров, определяемых в стартовом файле. Ну, роутер, сессия и т.п. И в том числе view и самый последний вложенный фильтр - выбор на основе подготовленных данных контроллера и его исполнение. Вот если отнести тот фильтр view ко view - то там вполне может ловиться HTTP исключение из контроллера и заменяться шаблон ;)
 

Absinthe

жожо
Я имел ввиду "Как? :confused: В реальном коде для пользы дела, а не синтетических примерах"

В представлении вызывается виджет/хелпер/etc который если что может бросить эксепшен Http, что в этом такого?
Виджет имеет свои вид-контроллер уровни(и исключение там будет кинуто не в виде явно), а прочим хелперам только ошибку 500 можно бросать.
Если нет, то расскажите, почему.
 
Сверху