如何在ajax请求中处理grails异常?

时间:2012-08-31 12:29:40

标签: grails groovy error-handling

如果我发出常规请求,我可以在UrlMappings.groovy中定义错误和异常的处理,如下例所示:

    "403"(controller: 'error', action: 'index', params:['code':'403'])
    "404"(controller: 'error', action: 'index', params:['code':'404'])
    "500"(controller: 'error', action: 'index', params:['code':'500'])
    "500"(controller: 'home', action: 'noPrivileges', exception: IllegalOperationException)

然后我可以处理特定控制器中的错误并呈现我选择的视图,例如

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}

这非常有效,每当服务器出现错误时,我都会收到错误页面。

现在我怎样才能为ajax请求实现完全相同的行为?我正在使用grails remoteFunctionformRemote制作ajax请求。每次在服务器上发生异常时,我都希望在javascript中执行相同的代码(例如,我想显示带警报的警报('有异常')。)​​

上述方法不适用于ajax请求。我仍然收到错误,即使错误中有myErrorPage.gsp的内容,它也不会打印到我使用formRemote或remoteFunction的update参数指定的html元素中。

3 个答案:

答案 0 :(得分:6)

我终于找到了一种完全干净的解决方案,与用于处理标准请求的方法兼容。

您需要修改处理错误的操作,如以下示例所示:

class ErrorController {

    def index = {
        if (request.xhr) {
             response.status = 200
             render template: "/errors/myAjaxErrorTemplate", model: [code: params.code]
        } else {
             render view: "/errors/myErrorPage", model: [code: params.code]
        }
    }
}

使用request.xhr,您可以区分ajax请求和标准请求。在ajax请求中,您还需要告诉grails,将响应状态设置为200,响应正常。

非常干净整洁。 :)我很惊讶这不能用Google搜索...

答案 1 :(得分:1)

remoteFunction会触发几个事件onFailureon_ERROR_CODE。您可以使用该事件来显示警告消息。

您可以在docs

中查看更多详情

答案 2 :(得分:0)

如果请求状态设置正确,您可以通过onFailure / remoteFunction的{​​{1}}属性定义JavaScript函数。

在此功能中,您可以在客户端处理异常。

使用文档中的示例,它可能如下所示:

formRemote