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

fixxxer

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

$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);
 

uid

Новичок
fixxxer
Я просто никак не могу заставить себя делить ошибки на системные/пользовательские. На мой взгляд, метод должен либо отдать мне мои данные, либо выкинуть исключение, возможно, содержащее поля/методы для уточнения проблемы. Зачем плодить сущности с дополнительными методами проверки ошибок?
 

fixxxer

К.О.
Партнер клуба
Исключения для пользовательских ошибок скрывают ошибки проектирования. Не должно быть необходимости ошибки валидации пробрасывать по стеку на дофига вызовов.

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

Silentland

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

fixxxer

К.О.
Партнер клуба
uid, а мне кажется, если модуль не знает о том пользовательский это ввод или нет, должен выкинуть исключение, а вот когда оно дойдет до места обработки пользовательского ввода, там исключение и преобразуется в ответ системы валидации
Да нет же! Не надо доводить до исключений.

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

uid

Новичок
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.
 

Ragazzo

TDD interested
uid
ты такой пример где нашел?я бы при всем своем желании не смог такое придумать :D тут не в exception проблема, а в логике, я долго думал почему за find скрывается 100500 хз каких исключений :D
 

Silentland

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

Фанат

oncle terrible
Команда форума
переносить логику модели в исключения - это будет посильнее Фауста Гёте...
 

uid

Новичок
Ragazzo
Смайлики ты будешь одноклассницам в асечке слать, тут они не совсем уместны. Напиши более логичную, на твой взгляд, реализацию, над которой не надо "долго думать".
 

Ragazzo

TDD interested
uid
Смайлики ты будешь одноклассницам в асечке слать
во-первых не надо хамить, то что ты нифига не понимаешь в программировании это твои проблемы, и то что ты здесь пишешь сущий бред. Весь твой пример можно префразировать в "жизненную ситуацию"
Захожу в магазин чтобы купить хлеб, и спрашиваю: "У вас есть хлеб?". И далее по твоей логике "программирования" продавщица вместо того чтобы ответить "да/нет", может либо выстрелить в тебя пистолетом, либо выбежать с криками "караул", либо расствориться в неизвестности. Вот так и выглядит твоя логика с исключениями. И не надо тут хамить мальчик-недоучка.
 

uid

Новичок
Ragazzo
>то что ты нифига не понимаешь в программировании это твои проблемы
И кто из нас двоих хамит?

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

>мальчик-недоучка
Судя по твоим высерам, из нас двоих ты больше подходишь под это определение.
 

Ragazzo

TDD interested
Ой, я забыл, уже весна же, и многие люди "на своей волне" :D я сливаюсь)
fixxxer
забей)
 

Lionishy

Новичок
fixxxer
Не конкретно в применении к Java. Скорее вообще к принципу декларирования исключений в рамках формального контракта.
 

fixxxer

К.О.
Партнер клуба
uid
пиши уж сразу class Model extends Exception, чо.

я свои соображения четко высказал, спорить не буду, сам когда-нибудь поймешь
 

uid

Новичок
fixxxer
Так все же, какие-нибудь недостатки, кроме религиозных, у данного подхода есть? Буквально в двух словах.
 

uid

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

Фанат

oncle terrible
Команда форума
*moderatorial*

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

Если ты видишь, что споришь против всех - надо быть вдвойне аккуратнее.
Не сводить дискуссию к флейму, и стараться найти точки соприкосновения, а не противостояния
 

Silentland

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