Я узнал из последних разработок Java, которые бросают RuntimeException
и обрабатывают его аспектно-ориентированными способами - это текущая тенденция обработки ошибок на уровне обслуживания. Это означает, что если что-то пойдет не так, вы просто выбросите RuntimeException
или даже лучше, пусть проверка бонуса сделает магию.Ошибки проверки и проверки на уровне обслуживания
Преимущество: вы не засовываете свой код try-catch
и if(entity.getName() == nil)
чеками. Все проверено в фоновом режиме, что делает ваш код более читаемым.
Так что мне интересно, как это будет сделано в Grails? Конечно, если я использую .save(failOnError:true)
, я получаю приятный ValidationException
. Но это приводит к очень неприятной странице ошибок по умолчанию, которая вообще не улучшает удобство использования веб-приложения.
Должен ли я поместить его в блок try-catch
на уровне контроллера? Скажем, в EntityService
есть метод, который выглядит следующим образом:
def toggleSomething(String entityId) = {
if(!someOtherPrerequisite) {
throw new EntityException("SomeOtherPrerequisite was not satisfied") // extends RuntimeException
}
Entity entity = Entity.get(entityId)
entity.someProperty = somePropertyValue
entity.save(failOnError:true) // throws a ValidationException
}
Затем контроллер будет зовите его следующим образом:
def toggle = {
try {
entityService.toggleSomething(params.id)
}
catch(e) {
flashHelper.error 'I'm sorry, something went wrong.'
}
}
Но это, кажется, довольно старой школы, когда Grails так ново школы во многих вещах. Нет ли способа обработать RuntimeExceptions
немного лучше, не забивая код try-catch
?
спасибо. Я прочитал еще несколько статей и сделал это похожим на ваш пример кода, но я возвращаю объект с ошибкой в службу. Просто вернусь, если у него есть ошибки вообще, поскольку логическое значение - отличная идея, и во многих случаях этого будет достаточно. –
Не стесняйтесь принять это как ответ. ;) – Gregg
Правда, я ждал еще нескольких входных данных, но мне кажется, что вы единственный гуру Grails здесь, на SO. ;) –