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

Spring异常处理程序记录所有异常但返回原始响应

阮轶
2023-03-14

因此,我试图以通用的方式记录spring项目的控制器返回的所有未捕获的异常。我可以使用以下异常处理程序来完成此操作:

@ControllerAdvice
public class ControllerConfig {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

public static final String DEFAULT_ERROR_VIEW = "error";

@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleBadRequest(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
    throw e;
}

@ExceptionHandler(AccessDeniedException.class)
public void defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception {
    logger.error("Error in request:" + request.getRequestURL(), e);
    throw e;
}

但是,对于方法的每次调用,由于方法中抛出的异常,会创建第二个错误日志:代码来自org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolveHandlerMethodException

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

那么有没有更聪明的方法返回方法的原始异常呢?

共有1个答案

祖利
2023-03-14

这取决于您所说的“返回原始异常的更聪明的方法”是什么意思。您想要返回给客户的具体内容是什么?如果这只是异常的消息,您可以简单地从异常处理程序返回它,并用@responsebody注释该方法。Spring会为你做剩下的。

@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleBadRequest(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
    throw e.getMessage();
}

您还可以返回一些自定义对象,该对象包装异常信息和您需要的任何其他数据。

 类似资料:
  • 这是我的方法,当我试图通过sonarQube分析我的代码时,我得到了这个错误: 异常处理程序应保留原始异常:记录或重新显示此异常。 为什么我会得到这个错误,我不应该像我的方法一样捕获异常吗? 我的方法:

  • 我有一个Groovy Spring Boot微服务,它返回一个帖子列表。请求进入控制器,控制器调用服务类中的方法,如果没有找到POST,则抛出自定义错误消息。 我已经创建了一个带有@ControllerAdvice注释的控制器,我想截获错误,并创建了一个特定于自定义错误的处理程序。它应该返回一个POJO。目前正在调用ControllerAdvice处理程序,但来自microservice的响应是5

  • 有没有一种方法可以在Spring Boot异常处理程序中一次捕获从web请求抛出的所有异常?我知道我可以在用注释的方法中捕获异常类型数组,但它不是我所说的类型。我需要一个异常对象列表之类的东西。我已经试过了 但Spring无法找到合适的解析器: 它只捕捉一个可抛物体,工作很好: 但是,如果在同一请求中有不同的参数冲突,如和,该怎么办? 如果不可能处理异常列表,如何满足RFC-7807(参见http

  • 我试图执行一些适用于代码中所有的通用逻辑。我知道我可以编写一个来拦截快乐路径。但是,我想连接到异常处理生命周期中,以便在呈现错误响应之前执行一些常见的逻辑,比如日志记录。 在Spring Boot/Spring MVC中有这样做的方法吗?如果可能的话,我希望避免为此编写servlet过滤器。

  • 我希望我的ExceptionMapper捕获所有异常并记录它们。。。我现在正在使用Jersey 2.0。 我有一个异常映射器,如下所示: 此异常映射器仅在非WebApplication应用程序异常时被调用。 如何使一个全局异常映射器捕获所有异常,以便记录它们。我还有别的办法吗? 谢谢

  • 1.1 异常处理的基本使用 try: <语句块1> except: <语句块2> try 捕获异常 except 发生异常时执行 try: <语句块1> except <异常类型名字>: <语句块2> except <异常类型名字> 发生对应异常时才会执行 1.2 异常处理的高级使用 try: <语句块1> except