Из последних разработок Java я узнал, что использование RuntimeException
и обработка его аспектно-ориентированными способами является современной тенденцией в обработке ошибок на сервисном уровне.Это означает, что если что-то пойдет не так, вы просто выбрасываете RuntimeException
или даже лучше, пусть Bean Validation сделает волшебство.
Преимущество в том, что вы не засоряете свой код с помощью 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
?