首先要搞明白都有哪些异常?
首先要明白异常拿来有什么用?
如果没有异常,后端出现问题了,前端只会显示一个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就是回馈信息
所以容器里有的,就是可预知异常,没有的就是统一处理的异常