Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ajax请求中处理grails异常?_Grails_Groovy_Error Handling - Fatal编程技术网

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

如何在ajax请求中处理grails异常?,grails,groovy,error-handling,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:['

如果我发出常规请求,我可以在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 = {
        if (request.xhr) {
             response.status = 200
             render template: "/errors/myAjaxErrorTemplate", model: [code: params.code]
        } else {
             render view: "/errors/myErrorPage", model: [code: params.code]
        }
    }
}
然后,我可以处理特定控制器中的错误,并呈现我选择的视图,例如

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}
这是完美的,每当服务器上出现错误时,我都会看到我的错误页面

现在,如何实现ajax请求的完全相同的行为?我正在使用grails或其他工具发出ajax请求。每当服务器上发生异常时,我都希望在javascript中执行相同的代码(例如,我希望用alert(“出现异常”)显示警报)


上述方法不适用于ajax请求。我仍然返回一个错误,即使错误中有myErrorPage.gsp的内容,它没有打印到我使用formRemote或remoteFunction的更新参数指定的html元素中。

如果请求状态设置正确,您可以通过
remoteFunction
/
formRemote
onFailure
属性定义JavaScript函数

在这个函数中,您可以在客户端处理异常

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

<select onchange="${remoteFunction(action: 'bookByName',
                       update: [success: 'great', failure: 'ohno'],
                       params: '\'bookName=\' + this.value'),
                       onFailure: 'handleError'}">
    <option>first</option>
    <option>second</option>
</select>

第一
第二

远程功能触发两个事件on failure和
on ERROR\u code
。您可以使用该事件显示警告消息


您可以在

中看到更多详细信息。我终于找到了一个与用于处理标准请求的方法兼容的完全干净的解决方案

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

    "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 = {
        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,响应就可以了


非常漂亮和干净。:)我很惊讶这不能被谷歌搜索到……

谢谢你的回答,但这不是我要问的。这样,我必须修改代码中的每个formRemote和remoteFunction。但这并不是这种方法最糟糕的缺点。它也不允许我根据服务器抛出的异常类型采取不同的操作。你知道我该如何实现这一点吗?是的,你可以,on_ERROR_CODE是一个事件,你可以用你的错误替换on_ERROR_CODE,例如on500(警报('That a big ERROR'))、on404(警报('ERROR 404'))等等。你可以创建一个javascript函数,并在500(myFunction('500'))和404(myFunction('404'))上传递代码。也许您可以使用jQuery来注入代码。是的,但我想根据异常类型而不是错误代码类型显示消息。我所有的异常都有相同的错误代码500。您需要检查jQuery文档:有一个
error
参数,它是一个有三个参数的函数,第三个参数是errorThrow。我不是jQuery专家,但我想你可以在这里找到你的解决方案。谢谢你的回答,但这不是我要问的。这样,我必须修改代码中的每个formRemote和remoteFunction。但这并不是这种方法最糟糕的缺点。它也不允许我根据服务器抛出的异常类型采取不同的操作。你知道我该如何实现这一点吗?在你的JavaScript函数中,你可以像这样访问你的响应的
状态
,比如
函数handleError(response){alert(response.status)}
-这样你就可以单独处理每个状态。。。