springboot 全局异常捕获不起作用解决与排查方案

如题

使用的是idea,我也不知道为什么,我建立完 GlobalExceptionHandler类之后就被idea给坑了

GlobalExceptionHandler类的小图标显示有一把叉叉,很不起眼的那种,后来一查才知道,原来是被编译器给排除了,气死我了,我今天一个晚上全搞这个问题去了,记录一下

解决方案:

File > Setting > Build > Compiler > Excludes, 把右边对应的显示叉叉的类移除即可

经过几个小时的努力终于爬出了这个坑,总结一下全局异常捕获失效的常见错误

  1. springboot 扫描包的时候出了问题,自己去扫包的地方检查清除,你的idea中GlobalExceptionHandler如果起作用了就会有这个小图标

在这里插入图片描述

  1. 你并没有将异常抛出,(很基础的问题)

    throw new ApiException()  //记得抛出
    
  2. 你自定义的GlobalExceptionHandler类中没有与抛出的Exception相匹配的 Exception

  3. 类没有参与编译,可能被编译器排除了,(我就是被这点坑了)

排查错误的时候多打调试输出,把输出看仔细,你也可以在GlobalExceptionHandler类里面 写Systom.out.println 看看对应的 Exception在抛出后能不能接到,比如这样:

@RestControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(NullPointerException.class)
    public Result NullPointer(NullPointerException ex){
        System.out.println("捕获到了NullPointerException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR_NULL);
    }

    @ExceptionHandler(ClassCastException.class)
    public Result ClassCastException(ClassCastException ex){
        System.out.println("捕获到了ClassCastException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR_CLASS_CAST);
    }

    @ExceptionHandler(IOException.class)
    public Result IOException(IOException ex){
        System.out.println("捕获到了IOException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR_IO);
    }

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Result HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException ex){
        System.out.println("捕获到了HttpRequestMethodNotSupportedException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR_MOTHODNOTSUPPORT);
    }

    @ExceptionHandler(ApiException.class)
    public Result ApiException(ApiException ex) {
        System.out.println("捕获到了ApiException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ex.getStatus(),ex.getMessage());
    }

    @ExceptionHandler(RuntimeException.class)
    public Result RuntimeException(RuntimeException ex){
        System.out.println("捕获到了RuntimeException");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR_RUNTION);
    }

    @ExceptionHandler(Exception.class)
    public Result exception(Exception ex){
        System.out.println("捕获到了Exception");
        logger.error(ex.getMessage(),ex);
        return Result.error(ApiResultEnum.ERROR);
    }

}

@ExceptionHandler(NullPointerException.class) 里面的参数的意思是,当你在外部抛出NullPointerException的异常时,这个注解下面对应的方法就会执行,然后我们就能在里面第一行写一个输出语句调试一下,如果不输出,那肯定是这个异常没有被捕获到,

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Spring Boot中,全局异常处理器可以用于捕获和处理应用程序中抛出的异常。然而,默认情况下,Spring Boot无法捕获和处理HttpMessageNotReadableException异常。这是因为HttpMessageNotReadableException异常是由HttpMessageConverter引起的,它在尝试将请求正文转换为控制器方法参数时发生错误。 要解决这个问题,你可以实现自己的全局异常处理器,并在其中捕获和处理HttpMessageNotReadableException异常。以下是一个示例: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity<Object> handleHttpMessageNotReadableException( HttpMessageNotReadableException ex, WebRequest request) { // 处理HttpMessageNotReadableException异常 // 返回自定义错误信息或其他逻辑 return new ResponseEntity<>("Error: Invalid request body", HttpStatus.BAD_REQUEST); } // 添加其他异常处理方法... } ``` 在上面的示例中,我们使用@ControllerAdvice注释来标记全局异常处理器类,并使用@ExceptionHandler注释来指定处理HttpMessageNotReadableException异常的方法。在方法中,我们可以根据需要自定义处理逻辑,并返回自定义错误信息或适当的HTTP状态码。 注意,为了使全局异常处理器生效,还需要确保在应用程序中启用了异常处理机制。你可以通过在应用程序的启动类上添加@EnableWebMvc或@EnableWebFlux注释来实现这一点。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值