Java 例外处理程序不';I don’我不能用一次性的

Java 例外处理程序不';I don’我不能用一次性的,java,rest,tomcat,spring-mvc,web-applications,Java,Rest,Tomcat,Spring Mvc,Web Applications,我们的是一个基于SpringMVC的REST应用程序。我正在尝试使用ExceptionHandler注释来处理所有错误和异常 我有 @ExceptionHandler(Throwable.class) public @ResponseBody String handleErrors() { return "error"; } 每当抛出异常时,这种方法都会起作用,对于任何错误都不起作用 我正在使用Spring4.0。有什么解决方法吗?与ExceptionH

我们的是一个基于SpringMVC的REST应用程序。我正在尝试使用ExceptionHandler注释来处理所有错误和异常

我有

    @ExceptionHandler(Throwable.class)
    public @ResponseBody String handleErrors() {
        return "error";
    }
每当抛出异常时,这种方法都会起作用,对于任何错误都不起作用


我正在使用Spring4.0。有什么解决方法吗?

ExceptionHandler#value()
属性指示的相反

Class<? extends Throwable>[] value() default {};
如您所见,它只接受一个
异常

使用此配置,您无法使用
@ExceptionHandler
处理
Throwable
Error
类型

<mvc:interceptors>
    <bean class="ErrorHandlingInterceptor" />
</mvc:interceptors>
我想告诉您提供自己的
HandlerExceptionResolver
实现,它处理可丢弃的
实例,但您需要提供自己的
DispatcherServlet
(以及大部分MVC堆栈)由于
DispatcherServlet
不会在任何地方捕获可丢弃的
实例,在这些地方,您可能会产生显著的差异


更新:


从4.3开始,SpringMVC将抛出的
Throwable
值包装在
NestedServletException
实例中,并将其公开给
ExceptionHandlerExceptionResolver

,您可以进行某种黑客攻击来捕获SpringMVC中的错误。 首先,定义一个拦截器,如下所示:

public class ErrorHandlingInterceptor extends HandlerInterceptorAdapter {
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
    super.afterCompletion(request, response, handler, ex);

    controller.handleError(ex.getCause(), request, response);
} }
其次,在控制器中定义一个方法,如“handleError”方法:

最后,在Spring配置中配置拦截器

<mvc:interceptors>
    <bean class="ErrorHandlingInterceptor" />
</mvc:interceptors>

是否有任何合理的、好的、合理的解释来解释您为什么要处理
错误
以及
异常
运行时异常
?处理可丢弃的
感觉就像。。。我错了。我想用一个有意义的json响应前端应用程序,但不想用500/stacktrace响应。有时候500是有意义的——这意味着服务器上出现了灾难性的错误。简单地说“错误”而不加上下文并不能解释真正发生的事情。@Makoto对于用户来说,这并不重要——不管是发生了灾难性的错误还是仅仅是错误——最终,某些功能不起作用,一个应该显示适当的错误。这已经被修复了-请参考这个答案:我该怎么做?有什么设计建议吗?Servlet过滤器或拦截器怎么样?@las
Throwable
Error
比响应您的客户机要严重得多。别理他们。只要配置和部署它们,就不会发生(尽可能多)。@SotiriosDelimanolis我完全同意,但我认为这是Spring的一个严重限制。处理所有可丢弃的
实例的一个合法案例是对它们进行自定义日志记录。此外,根据Spring的作者之一Juergen Hoeller的以下评论--
即使是OutOfMemoryError在某些情况下也是绝对可恢复的,因此捕获它们是非常有意义的。“mv=processHandlerException(processedRequest,response,handler,ex);“是Spring处理异常和唯一异常的位置。如果发生错误,它将转到catch Error语句,该语句将调用afterCompletion方法,该方法将错误转换为异常并由拦截器调用
<mvc:interceptors>
    <bean class="ErrorHandlingInterceptor" />
</mvc:interceptors>
            catch (Exception ex) {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
// This is where to handle Exception by Spring.
// If Error happens, it will go to catch Error statement 
// which will call afterCompletion method
            mv = processHandlerException(processedRequest, response, handler, ex);
            errorView = (mv != null);
        }

        // Did the handler return a view to render?
        if (mv != null && !mv.wasCleared()) {
            render(mv, processedRequest, response);
            if (errorView) {
                WebUtils.clearErrorRequestAttributes(request);
            }
        }
        else {
            if (logger.isDebugEnabled()) {
                logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +
                        "': assuming HandlerAdapter completed request handling");
            }
        }

        // Trigger after-completion for successful outcome.
        triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
    }

    catch (Exception ex) {
        // Trigger after-completion for thrown exception.
        triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
        throw ex;
    }
    catch (Error err) {
        ServletException ex = new NestedServletException("Handler processing failed", err);
        // Trigger after-completion for thrown exception.
        triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
        throw ex;
    }