springboot 全局异常捕获不起作用解决与排查方案
如题:使用的是idea,我也不知道为什么,我建立完 GlobalExceptionHandler类之后就被idea给坑了GlobalExceptionHandler类的小图标显示有一把叉叉,很不起眼的那种,后来一查才知道,原来是被编译器给排除了,气死我了,我今天一个晚上全搞这个问题去了,记录一下解决方案:File > Setting > Build > Compile...
如题:
使用的是idea,我也不知道为什么,我建立完
GlobalExceptionHandler
类之后就被idea给坑了
GlobalExceptionHandler
类的小图标显示有一把叉叉,很不起眼的那种,后来一查才知道,原来是被编译器给排除了,气死我了,我今天一个晚上全搞这个问题去了,记录一下
解决方案:
File > Setting > Build > Compiler > Excludes, 把右边对应的显示叉叉的类移除即可
经过几个小时的努力终于爬出了这个坑,总结一下全局异常捕获失效的常见错误
- springboot 扫描包的时候出了问题,自己去扫包的地方检查清除,你的idea中
GlobalExceptionHandler
如果起作用了就会有这个小图标
-
你并没有将异常抛出,(很基础的问题)
throw new ApiException() //记得抛出
-
你自定义的
GlobalExceptionHandler
类中没有与抛出的Exception相匹配的 Exception -
类没有参与编译,可能被编译器排除了,(我就是被这点坑了)
排查错误的时候多打调试输出,把输出看仔细,你也可以在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
的异常时,这个注解下面对应的方法就会执行,然后我们就能在里面第一行写一个输出语句调试一下,如果不输出,那肯定是这个异常没有被捕获到,
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)