Лучший способ обработки ошибок и сообщений в службе Grails

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

Information: 10 files processed successfully.

Warning: FileA is missing CreationDate

Error: FileB failed processing
Error: FileC failed processing
Error: FileD failed processing

Я знаю, что могу создать пользовательский объект, такой как «ServiceReturnObject», с такими свойствами, как:

def data
def errors
def warnings
def information

И пусть все мои службы возвращают этот объект.

Я также знаю, что могу использовать исключения, но я не уверен, что это правильное решение с несколькими исключениями и несколькими типами исключений.

Какова лучшая практика здесь? Примеры не помешали бы, спасибо.


person user1007895    schedule 11.07.2013    source источник


Ответы (1)


Чтобы возвращать ошибки, я бы создал собственный класс исключений и использовал его для переноса всех других ошибок, которые может генерировать служба. Таким образом, вам нужно поймать только ограниченное количество исключений. Если у вас есть более одного метода/закрытия контроллера, который должен возвращать ошибки, я бы использовал такой код:

Во-первых, создайте свой класс исключений и поместите его в src/java в правильном пространстве имен:

class MyException extends Exception {
    protected String code; // you could make this an int if you want
    public String getCode() { return code; }

    public MyException(String code, String message) {
        super(message);
        this.code = code;
    }
}

Теперь в вашем контроллере создайте метод обработки ошибок и заверните в него все вызовы.

class MyController {
    def myService;

    def executeSafely(Closure c) {
        Map resp = [:]
        try {
            resp.data = c();
        }
        catch(MyException myEx) {
            resp.error = myEx.getMessage();
            resp.code = myEx.getCode();
        }
        catch(Exception ex) {
            resp.error = 'Unexpected error: ' + ex.getMessage();
            resp.code = 'foo';
        }

        return resp;
    }


    def action1 = {
        def resp = executeSafely {
            myService.doSomething(params);
        }

        render resp as JSON;
    }

    def action2 = {
        def resp = executeSafely {
            myService.doSomethingElse(params);
        }

        render resp as JSON;
    }
}

В качестве альтернативы вы можете executeSafely преобразовать ответ в JSON и просто отобразить его напрямую.

person Gene Golovchinsky    schedule 11.07.2013
comment
Вы потом из сервиса только MyExceptionс кидаете? - person Charles Wood; 04.10.2013