【发布时间】:2013-11-11 17:05:02
【问题描述】:
我有一个 Grails 应用程序,它向后端服务器发出 HTTP 请求以获取其数据。该服务器可以被关闭以进行维护,并且当发生这种情况时,它将在 HTTP 响应中向 Grails 应用程序返回“站点关闭”消息。 Grails 应用程序检测到这一点并引发自定义 SiteDownException。在 URLMappings.groovy 中,这将被定向到特定的错误页面。
除了 AJAX 请求外,这很有效。似乎发生的是触发“站点关闭” URL 映射(如预期的那样),然后是捕获所有“500”映射。
URLMappings.groovy
"500"(controller: "error", action: "siteDown", exception: SiteDownException)
"500"(controller: "error", action: "error500")
ErrorController.groovy
def siteDown() {
println ">>>> site down <<<<"
}
def error500() {
println ">>>> 500 <<<<"
}
错误是使用
throw new SiteDownException()
对于常规请求,堆栈跟踪显示...
[11/11/13 16:52:50.945 error] SiteDownException occurred when processing request: [POST] /portal/contact/detail - parameters:
fileKeyIdentifier:
mode: add
Stacktrace follows: [org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver http-bio-8080-exec-6]
com.ui.exceptions.SiteDownException
at com.ui.backend.Backend$$EOMu30qx.getResponse(Backend.groovy:118)
at com.ui.backend.Backend$$EOMu30qx.getResponseAsDomainObject(Backend.groovy:41)
at com.ui.contact.ContactService.detail(ContactService.groovy:166)
at com.ui.contact.ContactController.detail(ContactController.groovy:87)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
>>>> site down <<<<
正确,但对于 AJAX 请求...
[11/11/13 16:54:09.380 error] SiteDownException occurred when processing request: [POST] /portal/contact/searchBody
Stacktrace follows: [org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver http-bio-8080-exec-7]
com.ui.exceptions.SiteDownException
at com.ui.backend.Backend$$EOMu30qx.getResponse(Backend.groovy:118)
at com.ui.backend.Backend$$EOMu30qx.getResponseAsDomainObject(Backend.groovy:41)
at com.ui.contact.ContactService.searchBody(ContactService.groovy:55)
at com.ui.contact.ContactController.searchBody(ContactController.groovy:23)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
>>>> site down <<<<
>>>> 500 <<<<
最后一位是关键 - 它显示来自 siteDown 操作的“站点关闭”消息,以及来自 catch all error500 操作的“500”。
谁能帮助解释为什么两个映射都被调用来处理 AJAX 错误?谢谢
【问题讨论】:
-
经过进一步思考,我决定将 SiteDownException 映射到我的 500 错误页面并选择 Exception.cause 来决定要显示的内容,但这仍然不起作用。对于 AJAX 错误,500 映射被调用两次,第一次传递了正确的异常,但第二次异常为空,所以对我来说仍然没有用。
标签: ajax grails exception-handling