600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > SpringBoot统一处理异常

SpringBoot统一处理异常

时间:2020-05-05 14:25:19

相关推荐

SpringBoot统一处理异常

首先要搞明白都有哪些异常?

首先要明白异常拿来有什么用?

如果没有异常,后端出现问题了,前端只会显示一个500,用户在看到这个反馈结果时直接懵逼了,体验绝逼超级不好。

所以,异常就是在出错的时候给用户反馈相应的信息,你至少得让用户知道错在什么地方吧。

异常的分类

归为三大类

1.我们自己定义的异常CustomException

public class CustomException extends RuntimeException {ResultCode resultCode;public ResultCode getResultCode() {return resultCode;}public CustomException(ResultCode resultCode) {this.resultCode = resultCode;}}

为什么要继承RuntimeException ,因为这样对代码没有侵入性,我们要抛的时候只用

throw new CustomException(resultCode);

就行了,不用写try/catch了。

2.不是我们定义的异常Exception,但我们可预知的

例如现在有个HttpMessageNotReadableException,虽然不是我们自己写的,但我们知道它会来,所以当我们捕获到它时,就给用户反馈一个相应的信息,至于具体的操作在后面写

3.不是我们定义的异常Exception,且我们不可预知的

对于不可预知的异常,我们就进行统一处理,他们反馈给用户一个相同的结果,例如“系统繁忙,请稍后再试”之类的甩锅的话就行了

异常的捕获类

@RestControllerAdvicepublic class CatchException {private static ImmutableMap<Class<? extends Throwable>, ResultCode> mvcExceptions;private static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();@ExceptionHandler(CustomException.class)public ResponseResult catchCustomException(CustomException customException){return new ResponseResult(customException.getResultCode());}@ExceptionHandler(Exception.class)public ResponseResult catchException(Exception exception){if (mvcExceptions == null) {mvcExceptions = builder.build();}ResultCode resultCode = mvcExceptions.get(exception.getClass());if (resultCode != null) {return new ResponseResult(resultCode);}else {return new ResponseResult(CommonCode.SERVER_ERROR);}}static {builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PRAMAS);}}

@RestControllerAdvice注解就是声明该类是个异常捕获类,并且返回一个json数据

@ExceptionHandler(CustomException.class)public ResponseResult catchCustomException(CustomException customException){return new ResponseResult(customException.getResultCode());}

该方法就是捕获自定义异常的,当捕获到CustomException异常时就会执行catchCustomException函数

@ExceptionHandler(Exception.class)public ResponseResult catchException(Exception exception){if (mvcExceptions == null) {mvcExceptions = builder.build();}ResultCode resultCode = mvcExceptions.get(exception.getClass());if (resultCode != null) {return new ResponseResult(resultCode);}else {return new ResponseResult(CommonCode.SERVER_ERROR);}}

catchException方法是捕获Exception的,也就是这里捕获到之后,我们得进行一个判断,看它在不在我们的预知范围内,具体怎么判断呢

private static ImmutableMap<Class<? extends Throwable>, ResultCode> mvcExceptions;

这个map容器里面装的就是类似于HttpMessageNotReadableException之类的可预知异常,key就是异常的class文件,value就是回馈信息

所以容器里有的,就是可预知异常,没有的就是统一处理的异常

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。