具体的方法上用throws 抛出异常.
统一思想,逐层上抛,统一处理.
自定义异常类
import com.xuecheng.framework.model.response.ResultCode;
public class CustomException extends RuntimeException{
ResultCode resultCode;
//ResultCode 为异常的属性 信息
public CustomException(ResultCode resultCode){
this.resultCode=resultCode;
}
public ResultCode getResultCode(){
return this.resultCode;
}
}
用静态方法抛出自定义异常
import com.xuecheng.framework.model.response.ResultCode;
public class ExceptionCast {
//使用静态方法[抛出自定义异常
public static void cast(ResultCode resultCode){
//抛出该异常 的对象
throw new CustomException(resultCode);
}
}
//使用:
if (cmsPage ==null){
ExceptionCast.cast(CmsCode.CMS_NOFIND_ERROR);
}
具体异常捕获类
import com.google.common.collect.ImmutableMap;
import com.xuecheng.framework.model.response.CommonCode;
import com.xuecheng.framework.model.response.ResponseResult;
import com.xuecheng.framework.model.response.ResultCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.EventRecodingLogger;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 统一异常捕获类
*/
@ControllerAdvice //控制器增强
public class ExceptionCatch222 {
//日志属性
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch222.class);
//使用EXCEPTIONS存放异常类型和错误代码的映射,ImmutableMap的特点的一旦创建不可改变,并且线程安全
// 改Map集合的键值对
// 键为:Class<? extends Throwable> 一个具体的异常类
// 值为: ResultCode 出现该异常需要显示的信息
private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
// 上面的整个Map需要构造器 启动 builder为改Map集合的构造启动器
private static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();
static {
//此静态代码块的含义时,初始化Map容器时里面已经有的
//具体的异常类 和 出现该异常需要显示的信息
builder.put( HttpMessageNotReadableException.class,CommonCode.INVALLD_PARAM);
}
/**
* 自定义异常类的自动抓取
*
* @param customException
* @return
*/
@ExceptionHandler(CustomException.class) //该注解表示 只要出现CustomException异常 自动执行下面的方法体
@ResponseBody //返回值为json格式
public ResponseResult CustomException(CustomException customException) {
//执行到这里 表示出现异常所有记录日志
LOGGER.error("catch exception{}", customException.getMessage());
//通过自定义异常的静态方法 得到抛出的错误码和信息
ResultCode resultCode = customException.getResultCode();
//返回改错误码和信息
return new ResponseResult(resultCode);
}
/**
* 不可预知异常的自动抓取
*
* @param exception
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult Exception(Exception exception) {
//代码执行到这里表示出现了 异常需要记录日志
LOGGER.error("catch exception{}", exception.getMessage());
//1.首先判断这个EXCEPTIONS 是否已经被构造
if (EXCEPTIONS == null) {
EXCEPTIONS = builder.build();
}
// 2. 从EXCEPTIONS容器中拿到 目前这个异常的错误代码的映射
ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
//3.判断这个错误代码的映射 在容器中有没有 没有的话就返回通用的 错误代码映射 有的话就返回这个映射
if (resultCode == null) {
return new ResponseResult(CommonCode.SERVER_ERROR);
} else {
return new ResponseResult(resultCode);
}
}
}