Java 例外处理程序不';I don’我不能用一次性的
我们的是一个基于SpringMVC的REST应用程序。我正在尝试使用ExceptionHandler注释来处理所有错误和异常 我有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
@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过滤器或拦截器怎么样?@lasThrowable
和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;
}