Exceptions как и с чем

WMix

герр M:)ller
Партнер клуба
еще раз хочется поднять тему обработки исключений.

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

хочется выкинуть из модели всякие extends BadRequestHttpException, а понятия как правильно сделать нет.
 

WMix

герр M:)ller
Партнер клуба
я не об этом, есть обработчик, до него дошло исключение, надо оповестить клиента.
BadRequestHttpException явно не модель. а ошибка валидности..
 

AnrDaemon

Продвинутый новичок
До него дошло, как шифровка до Штирлица, или он поймал исключение, о котором он в курсе?
Если как до штирлица, то 500 ISE.
Если второе, то сам ответь на свой вопрос.
 

Фанат

oncle terrible
Команда форума
Если я правильно понял вопрос.
http - это ни разу не модель, она вообще не должна знать, через какой внешний интерфейс ее вызвали. может, это CLI?
А такие броски, с http в имени в модели встречаются сплошь и рядом.
И мне тоже интересно, как перемапить NotEnoughPermissionsException в 403
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Ещё раз - твой вопрос о чём вообще? Как классифицировать полученные эксепшены или как их представить в виде кодов HTTP, или что вообще?
 

WMix

герр M:)ller
Партнер клуба
как их классифицировать (наследовать) правильно, чтоб разобрать их и представить в виде кодов HTTP без лишних телодвижений
 

AnrDaemon

Продвинутый новичок
Классифицировать как ты считаешь нужным. There's no silver bullet (q)
Что считать "лишними" телодвижениями?
 

Yoskaldyr

"Спамер"
Партнер клуба
Например в том же ADR - domain слой вообще не должен выбрасывать исключения, он только возвращает payload с определенным статусом, на базе которого responder возвращает необходимый ответ с необходимым http кодом.
Пример базового набора статусов
https://github.com/auraphp/Aura.Payload_Interface/blob/3.x/docs/index.md
Или например более расширенный вариант
https://github.com/equip/adr/blob/master/src/Status.php
 

Yoskaldyr

"Спамер"
Партнер клуба
ну тоже решение но от чего шли на то и набрели
Это конечно крайности, мне реально ауровского пейлоада для всего хватало, но правда не было ничего навороченного в плане типов ответов все просто, или ок или редирект или 403/404 или 50х (в зависимости от типа ошибки).
 

WMix

герр M:)ller
Партнер клуба
если отбросить http то вроде все на место становится, уверен что во множестве случаев я смогу как веб- так и консольному-клиенту вывести подобные ошибки. такой вывод напрашивается что в середине не хватает catch( BadInputException $e ) throw new BadRequestHttpException(), те нет представления как отвязаться от контекста webserver. при этом messge хочется более информативным сделать, это не одна ошибка это множество.
 

WMix

герр M:)ller
Партнер клуба
подумав, соглашусь, что аура довольно краткий и достаточно информативный список
 

AnrDaemon

Продвинутый новичок
По поводу вывода ошибок всё просто.
Если ты знаешь, что ошибка произошла не по вине клиента - 500 ISE или если ошибка была ожидаемая - более точный 5xx код.
Если ошибка по вине клиента, то что он может сделать для её решения? Если ничего, то 400 бэд реквест, иначе 403/404/405/…
 

fixxxer

К.О.
Партнер клуба
С моделями все очень просто.
То, что декларировано в @throws, в месте вызова должно быть обработано в соответствии с контекстом. (Валидация уровня клиентского api к тому моменту уже должна была быть проведена, разумеется, я о более тонких случаях).
Все остальное словится на верхнем уровне и будет 500: если у меня в модели сработал assert - I fucked up.
 

WMix

герр M:)ller
Партнер клуба
(Валидация уровня клиентского api к тому моменту уже должна была быть проведена, разумеется, я о более тонких случаях).
и где это делать? в контроллере
PHP:
if( $form->isValid() ) {
  $model->do($form->value('first'), $form->value('second'));
}
else throw BadRequestHttpException($form->messages())
напоминает zend
 
Сверху