如题

使用的是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的异常时,这个注解下面对应的方法就会执行,然后我们就能在里面第一行写一个输出语句调试一下,如果不输出,那肯定是这个异常没有被捕获到,

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐