мой велосипед с квадратными колесами

uid

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

PHP:
$model = new Model_User();
$user = $model->getByName($request->username);
if($errors = $model->getErrors()){
// страница ошибки
}else{
return $this->render('userpage', $user);
}
или
PHP:
try{
$model = new Model_User();
$user = $model->getByName($request->username);
return $this->render('userpage', $user);
}catch(UserException $e){
// страница ошибки
}
Причем действия для показа страницы ошибки обычно весьма однотипны. А что, если исключения не обрабатывать до самой точки запуска приложения? Код
PHP:
throw new UserException('пользователь не найден', 404);
содержит всю необходимую информацию для отображения дефолтной страницы ошибки. От случайного показа юзеру исключений с системными сообщениями защищает проверка кода исключения и его типа: если $e instanceof MyAppException == false или $e->getCode() == 0, то исключение у нас системное и показывать его текст не надо. Таким образом, можно вынести логику обработки всех типовых ошибок в точку запуска приложения и писать просто
PHP:
$model = new Model_User();
$user = $model->getByName($request->username);
return $this->render('userpage', $user);
, не думая об исключениях. Если будет нужно, всегда можно перехватить их и обработать по-своему.

Насколько рационально использование такого подхода в реальных проектах?
 

Фанат

oncle terrible
Команда форума
только такой и используется.
try..catch чтобы показать сообщение об ошибке пишут только лохи. и авторы ануала по похапе.
 

uid

Новичок
Фанат
Я ни разу не встречал такой реализации.
 

uid

Новичок
Фанат
> Волшебные слова - http://php.net/manual/ru/function.set-exception-handler.php
Я знаю про эту функцию, но есть один момент: для обработки исключений нам надо провести ряд действий. Например, получить откуда-то инстанс шаблонизатора и отрендерить шаблон error.tpl. И если в нем возникнет исключение, как оно будет обработано? Кэллбэк в set_exception_handler лучше сделать самым последним "рубежом" и в зависимости от среды(дев или продакшн) выдавать полную инфу(сообщение, код, трейс, все предыдущие исключения) или скромную надпись "service unavalible" и писать сведения об исключении в лог.
 

Фанат

oncle terrible
Команда форума
не надо ничего рендерить.
надо тупо отдать нжинксу код, а он уже покажет статическую страницу.
про порядок и колбеки ничего не понял. что куда кому показывать - вопрос десятый. По умолчанию все равно все в лог пишется, вся эта разноцветная порнография онлайн - частный случай, не стоящий внимания.
если знаешь, то при чем здесь велосипед?
 

uid

Новичок
Фанат
> надо тупо отдать нжинксу код, а он уже покажет статическую страницу.
А если мне надо показать свой текст ошибки? Или в зависимости от того, пришел ли запрос аяксом, обернуть текст в шаблон страницы либо отдать как есть?

> если знаешь, то при чем здесь велосипед?
Этого решения я до сих пор не встречал, хотя оно и кажется логичным.
 

Фанат

oncle terrible
Команда форума
А если мне надо
1. Чем система проще, тем она стабильнее.
2. Почему все разработчики всегда так чудовищно озабочены свистелками и перделками, не сделав еще основной функционал даже в черновике?
Почему всех устраивает ответ кодом возврата в аякс, а тебе вдруг прямо так встряло хтмл шарашить?
Ты уже сделал показ статической страницы? Он не работает? Тебе уже прям сейчас невтерпёж показывать свое кастомное "идите отсюда спасибо" вместо "извините спасибо пожалуйста"?
И если в нем возникнет исключение, как оно будет обработано?
НИКАК. Останется необработанным. Пых выплюнет 503, нжинкс покажет статическую страницу.
 

Фанат

oncle terrible
Команда форума
А, самое главное, больше всего умиляет эта наивная вера в то, что тебе будет дело до каждой ошибки, оборачивать её в кастомный аяксик, запеленывать в отдельный хтмльчик.
ВМЕСТО ТОГО ЧТОБЫ ИСПРАВИТЬ.
 

uid

Новичок
Суть в том, чтобы исключения, наследованные от AppException и имеющие код > 0, обрабатывались и показывались пользователю. Логгировать их тоже необязательно, кстати, т.к. это часть логики приложения.
 

uid

Новичок
Как я могу ПРОСТО ИСПРАВИТЬ ошибку валидации? Приходить домой к каждому юзеру, вводящему некорретные данные, и отрубать пальцы?
 

Фанат

oncle terrible
Команда форума
Кидать исключения при валидации - от лукавого.
поскольку невалидный ввод - ситуация ни разу не исключительная, а самая что ни на есть штатная и предусмотренная.
но если уж используешь исключения как goto - то и используй уже до конца, ставя метку, на которую перепрыгивать, то есть catch
при чем здесь 404 - я не понял
 

Фанат

oncle terrible
Команда форума
В общем, как всегда, суть проблемы оказалась в двусмысленности.
Начал ты за здравие исключений с ошибками, а закончил за упокой аппликейшен ексепшенс.
Лично я считаю последние глупостью.
Делать на них выделенные хендлеры - тем более. Валидация ведь всегда разная. В одном месте цена слишком большая, а в другом пароль неправильный. Писать в обработчике кейс и с каждой новой формой бегать туда? Спасибо, идите дальше.
 

hell0w0rd

Продвинутый новичок
Уоу! А зачем бросать исключение, если юзер ввел невалидные данные? Просто не принимаешь форму и указываешь на ошибки. Может он очепятался
А в шаблоне с формой уже должен быть предусмотрен вывод ошибок.
 

fixxxer

К.О.
Партнер клуба
Если пользователь ввел невалидные данные, не надо бросать исключение. Исключения не для этого. Был большой тред на эту тему.
 

hell0w0rd

Продвинутый новичок
Да говно эта статья. «Ошибки» — не более, чем наследие. Любую такую «ошибку» можно и нужно превращать в исключение.
ТС вообще о других ошибках говорил - о ошибках валидации. Это точно не исключения и не ошибки. В данном случае приложение делает то что задумано.
 
Сверху