当前位置: 首页 > 知识库问答 >
问题:

与@响应状态一起处理异常

公孙联
2023-03-14

我有一个ControllerAdvice类,它处理一组异常。我们还有其他一些例外情况,这些例外情况用注释进行了注释。为了结合这两种方法,我们使用博客文章中描述的技术:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc,即在ControllerAdvice中,我们以以下方式处理一般异常:

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        // If the exception is annotated with @ResponseStatus rethrow it and let
        // the framework handle it - like the OrderNotFoundException example
        // at the start of this post.
        // AnnotationUtils is a Spring Framework utility class.
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
            throw e;

        // Otherwise setup and send the user to a default error-view.
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        return mav;
    }

它就像一个符咒,但是,使用此技术会导致应用程序日志中出现以下文本错误:

2014-06-11 15:51:32.907 ERROR o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...

这是由ExceptionHandlerExceptionResolver中的这段代码引起的:

try {
            if (logger.isDebugEnabled()) {
                logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod);
            }
            exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception);
        }
        catch (Exception invocationEx) {
            logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx);
            return null;
        }

有人知道如何将这两种异常处理方法正确地结合起来以避免日志中的错误吗?

谢谢,简

共有3个答案

宋博易
2023-03-14

当我错过这个导入时,我也遇到了同样的问题:

import org.springframework.http.HttpStatus;

Eclipse没有让我在Quick Fix中添加它,我手动添加了行,这很有帮助。

彭梓
2023-03-14

我用一种稍微不同的方式来处理它,我认为这解决了你的问题。

因为我知道基本上我想处理404和500s不同的颜色,所以我会寻找一个NOT\u FOUND状态并相应地发送它,这似乎有效,然后你不会抛出异常。

这意味着

@ControllerAdvice
public class MVCExceptionHandler {
    private static final Logger log = LogManager.getLogger();

    @ExceptionHandler(Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, HttpServletResponse res, Exception ex) throws Exception {

        // If the exception is annotated with @ResponseStatus check if it's a 404 in which case deal with it, otherwise 500 it.
        if (AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class) != null) {
            ResponseStatus rs = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
            if (HttpStatus.NOT_FOUND.equals(rs.value())) {
                res.setStatus(HttpStatus.NOT_FOUND.value());
                return new ModelAndView("error/404");
            }
        }

        log.error("Error while loading", ex);

        return new ModelAndView("error/500");

    }
}
公冶鸣
2023-03-14

这是一个老问题,但我今天刚刚遇到了这个问题,并找到了一个比禁用ExceptionHandlerExceptionResolver的日志记录更好的解决方案。事实证明,这个问题可以通过升级到最新版本的spring框架(4.3.8适合我)来解决。已修复异常句柄异常解析器(ExceptionHandlerExceptionResolver),以检测原始异常是否是从异常处理程序(ExceptionHandler)中重新获取的。在这种情况下,将不再记录异常。

 类似资料:
  • 主要内容:追踪Poll,其实真正处理响应是在 Networkclient的poll,步骤三追踪Poll 从poll里面进入slector的poll调用addToStagedReceives()进行消息处理(把接收的数据加入到待处理队列); 相应数据结构 selector的poll() addToCompletedReceives(),把响应存入到completedReceives 其实真正处理响应是在 Networkclient的poll,步骤三 调用 handleCompletedR

  • 前言 在 gRPC 的新版本(1.0.0-pre2)中,为了方便传递 debug 信息,在 StatusException 和 StatusRuntimeException 中增加了名为 Trailer 的 Metadata。 注: 在此之前,Status(和Status映射的StatusException)只有两个字段可以传递信息:1. status code 2. status decript

  • 我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然得到状态代码200(不包括404-500,以及关于实际服务器或用户连接的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorcode:number,message:string。这是不会改变的。 使用关于令牌的相同示例,

  • 我正在使用Spring Boot 2和带有WebFlux反应式启动器的Spring 5开发一些反应式微服务。 我面临以下问题:我想处理调用另一个REST服务时收到的所有HTTP状态,并在收到一些错误的HTTP状态时抛出异常。例如,当我调用一个endpoint并收到404 HTTP状态时,我想抛出一个异常,并在某个ExceptionHandler类中处理该异常,就像在Spring 4中使用时一样。

  • 我对这个可完成的未来概念很陌生。我使用Spring的异步注释,为此我为执行器和异常处理程序添加了一个文件配置,如下所示: 然后我有一个方法,我想异步运行并返回CompletableFuture: 现在,如果在上述方法调用中发生了一些异常,那么我应该如何处理该异常? 注意:如果我不返回CompletableFuture并返回vo,它将转到异常处理程序AsyncUncaughtExceptionHan

  • 做一个简单的井字游戏。我尝试在鼠标进入时突出显示单个单元格,然后在鼠标离开时恢复正常-使用状态和内联样式来完成这一点。状态在鼠标进入时变化很好(样式也是如此),但在鼠标离开时不会恢复正常。我在这里错过了什么?