Тупые вопросы про Exception

В случае с моделью, я бы сделал так (ну, то есть, я именно так и делаю).

$model->validate() возвращает true/false, в случае false можно посмотреть $model->getValidationErrors() (или просто отрендерить модель прямо с ошибками). Важно, что тут мы проверили все поля, а не остановились на первом.

А вот если дергаем $model->save() с ошибками валидации (save валидацию тоже делает внутри) - это уже exception.

Конечно, валидацию надо делать "ленивой", не проверяя одно и то же сто раз.

(Псевдо)код экшена контроллера тогда будет примерно такой:

PHP:
$model->updateAttributesFrom($request->post);
if ($model->validate()) {
    $model->save();
    return $this->redirectTo($this, 'index');
}
$view->bind('model', $model);
return $this->render($view);
 
fixxxer
Я просто никак не могу заставить себя делить ошибки на системные/пользовательские. На мой взгляд, метод должен либо отдать мне мои данные, либо выкинуть исключение, возможно, содержащее поля/методы для уточнения проблемы. Зачем плодить сущности с дополнительными методами проверки ошибок?
 
Исключения для пользовательских ошибок скрывают ошибки проектирования. Не должно быть необходимости ошибки валидации пробрасывать по стеку на дофига вызовов.

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

Да нет же! Не надо доводить до исключений.

Если мы провалидировали, отправили на save(), и уже там обнаружилось, что провалидировали плохо - это исключение (ошибка в логике). Это надо править, а не затыкать catch-ами.
 
fixxxer
Допустим, мне надо привязать к ошибке какие-то дополнительные данные, причем метод может сгенерировать несколько ошибок с разным набором этих данных.

Если у покупателя не хватает денег на товар(BeggarException), я хочу сразу получить стоимость товара и кол-во денег у покупателя. Если товар нельзя отправить в страну покупателя(UntermenschException), я хочу сразу получить его страну и т.д., без дополнительных дерганий модели и других плясок. Вот псевдокод:

PHP:
$product = new ProductModel();
try{
	$data = $product->findByName('fingerbox');
	// все ок, работаем с $data
}catch(UntermenschException $e){
	return sprintf(
		'в парашу под названием %s мы ничего слать не будем',
		$e->getCountry()
	);
}catch(BeggarException $e){
	return sprintf(
		'у тебя не хватает всего %s тугриков. работай, солнце еще высоко',
		($e->getPrice() - $e->getCash())
	);
}
Как можно сделать так же логично и читабельно, но без исключений? И не забываем про ide, которая услужливо подскажет нам @throws у findByName и доп. методы у $e.
 
uid
ты такой пример где нашел?я бы при всем своем желании не смог такое придумать :D тут не в exception проблема, а в логике, я долго думал почему за find скрывается 100500 хз каких исключений :D
 
Если мы провалидировали, отправили на save(), и уже там обнаружилось, что провалидировали плохо - это исключение (ошибка в логике). Это надо править, а не затыкать catch-ами.
Логично, но вот пример. Пользователь заполнил анкету, прикрепил файл, мы ее проверили, все ОК, стали сохранять файл, оказалось что в папке закончилось место, к примеру, или файловый сервер сдох. Кинули исключение. Модуль валидации его поймал и преобразовал в ответ для пользователя: анкету сохраним, а файл загрузите еще раз позже.
 
переносить логику модели в исключения - это будет посильнее Фауста Гёте...
 
Ragazzo
Смайлики ты будешь одноклассницам в асечке слать, тут они не совсем уместны. Напиши более логичную, на твой взгляд, реализацию, над которой не надо "долго думать".
 
uid
Смайлики ты будешь одноклассницам в асечке слать
во-первых не надо хамить, то что ты нифига не понимаешь в программировании это твои проблемы, и то что ты здесь пишешь сущий бред. Весь твой пример можно префразировать в "жизненную ситуацию"
Захожу в магазин чтобы купить хлеб, и спрашиваю: "У вас есть хлеб?". И далее по твоей логике "программирования" продавщица вместо того чтобы ответить "да/нет", может либо выстрелить в тебя пистолетом, либо выбежать с криками "караул", либо расствориться в неизвестности. Вот так и выглядит твоя логика с исключениями. И не надо тут хамить мальчик-недоучка.
 
Ragazzo
>то что ты нифига не понимаешь в программировании это твои проблемы
И кто из нас двоих хамит?

>может либо выстрелить в тебя пистолетом, либо выбежать с криками "караул", либо расствориться в неизветстности
Без комментариев. И да, более логичной(да и вообще хоть какой-нибудь) реализации моего кода в 10 строчек я от тебя не дождусь, инфа 146%.

>мальчик-недоучка
Судя по твоим высерам, из нас двоих ты больше подходишь под это определение.
 
Ой, я забыл, уже весна же, и многие люди "на своей волне" :D я сливаюсь)
fixxxer
забей)
 
fixxxer
Не конкретно в применении к Java. Скорее вообще к принципу декларирования исключений в рамках формального контракта.
 
uid
пиши уж сразу class Model extends Exception, чо.

я свои соображения четко высказал, спорить не буду, сам когда-нибудь поймешь
 
fixxxer
Так все же, какие-нибудь недостатки, кроме религиозных, у данного подхода есть? Буквально в двух словах.
 
fixxxer
Ну ладно, давай с другой стороны. Если я буду писать лапшу, мне будет трудно вносить изменения и вообще поддерживать код. Хардкодинг грозит проблемами при переносе в другое окружение. Чем может грозить в будущем мой подход?
 
*moderatorial*

uid
если тебя оскорбляют смайлики, то настоятельно рекомендую пойти отдохнуть, и продолжить дискуссию завтра.

Если ты видишь, что споришь против всех - надо быть вдвойне аккуратнее.
Не сводить дискуссию к флейму, и стараться найти точки соприкосновения, а не противостояния
 
переносить логику модели в исключения - это будет посильнее Фауста Гёте...
А как сделать без этого на моем примере? Загрузится файл на сервер или нет, мы не можем проверить на этапе валидации. Нам об этом загрузчик по факту скажет. И получается, сказать нам об этом он должен не исключением... Либо выдать исключение, но программа должна заглохнуть, а полльзователь получить 500 ошибку
 
Сверху