Я знаю, как выполнять общую обработку исключений в Grails с использованием UrlMappings и ErrorController для общей обработки исключений, так что если исключение ускользает от контроллера, пользователь будет отправлен на общую страницу ошибок, и исключение будет быть зарегистрированным. Я также знаю, как использовать блоки try/catch для обработки определенных исключений и пытаться восстановить их.Обработка исключений в контроллерах Grails
Но в большинстве контроллеров я просто хочу дать пользователю несколько более конкретное сообщение об ошибке, если возникло исключение. Поэтому в действии create я хочу сообщить пользователю, что элемент не был создан. Или в действии импорта я хочу сообщить пользователю, что импорт завершился неудачно. Прямо сейчас, контроллеры выглядят как:
class ThingController {
def create = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to create the Thing")
}
}
def delete = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to delete the Thing")
}
}
private void handleException(Exception e, String message) {
flash.message = message
String eMessage = ExceptionUtils.getRootCauseMessage(e)
log.error message(code: "sic.log.error.ExceptionOccurred", args: ["${eMessage}", "${e}"])
redirect(action:index)
}
}
Обратите внимание, что ловить блоки ничего другого на основе типа или содержания, за исключением не делать; они просто дают немного более описательное сообщение об ошибке на основе контроллера. «Настоящий» код контроллера обычно составляет 6-10 строк, поэтому наличие дополнительных 4 строк кода просто для изменения сообщения об ошибке кажется чрезмерным. Кроме того, правило CodeNarc «CatchException» жалуется, что подтверждает мое мнение о том, что должен быть лучший способ сделать это. Я предполагаю, что другие приложения Grails имеют аналогичные требования. Что такое idiomatic способ указать разные сообщения об ошибках, исходя из которых действие вышло из-за исключения?
Меня интересуют ответы, которые исходят из опыта с определенным способом решения этой проблемы или, что еще лучше, ссылки на кодовые базы, где я вижу решение на практике.
Для пустых голосов, пожалуйста, объясните, что нужно изменить относительно вопроса или почему это не подходит для переполнения стека. Спасибо –