我们要捕捉两种异常:自定义(可预测),框架自带的(不可预测)
知识点:
说到异常肯定要与logger日志对象打交道,好记性不如烂笔头 @ControllerAdvice //控制器增强 ImmutableMap:这个map写完不能改,可以用做只读(com.google.common.collect.ImmutableMap) ResultCode类:包装三个属性(操作成功与否,code数字,message信息),结果响应三兄弟 ResponseResult类:同样是三兄弟,在此基础上兼容(CommonCode枚举类)所有对象代码:
@ControllerAdvice public class ExceptionCatch { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class); //定义EXCEPTIONS(map类型),记录异常类型所对应的错误代码 private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS; protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder(); //捕获自定义异常 @ExceptionHandler(CustomException.class) @ResponseBody public ResponseResult customException(CustomException customException){ LOGGER.error("catch exception:{}",customException.getMessage()); ResultCode resultCode = customException.getResultCode(); return new ResponseResult(resultCode); } //捕获Exception类异常 @ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception exception){ LOGGER.error("catch exception:{}",exception.getMessage()); if(EXCEPTIONS == null){ EXCEPTIONS = builder.build();//EXCEPTIONS构建成功 } //从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应99999异常 ResultCode resultCode = EXCEPTIONS.get(exception.getClass()); if(resultCode !=null){ return new ResponseResult(resultCode); }else{ return new ResponseResult(CommonCode.SERVER_ERROR); } } static { //定义 异常类型所对应的错误代码 builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM); } }