2

我有一个 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

并让我所有的服务都返回这个对象。

我也知道我可以使用异常,但我不确定这是否是具有多个异常和多种异常类型的正确解决方案。

这里的最佳做法是什么?例子会很有帮助,谢谢。

4

1 回答 1

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 并直接呈现。

于 2013-07-11T17:34:05.800 回答