自定义异常类型
自定义错误代码及错误信息
对于可预知的异常由程序员在代码中主动抛出 由SpringMVC捕获
可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常
不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为RuntimeException类型(运行时异常)
可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示 最后也会随请求相应给客户端
具体的流程
在controller、service、dao中程序员抛出自定义异常;SpringMVC框架抛出框架异常类型
统一由异常捕获类捕获异常,并进行处理
捕获到自定义异常则直接取出错误代码及错误信息 相应给客户
捕获到非自定义异常类型首先从map中找该异常类型是否对应具体的错误代码 如果由则去除错误代码及错误信息返回给客户 如果map中找不到异常类型所对应哪个的错误代码则统一位99999错误代码并返回给用户
在service方法中的编码顺序是先校验判断,有问题则抛出具体的y异常信息,最后执行具体的业务操作 返回成功信息
编写统一异常处理类去捕获异常 向用户返回统一规范的相应信息
service模板
首先定义相应格式
编写自定义异常类
异常抛出类
异常捕获类
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.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;
/**
* User: 李锦卓
* Time: 2019/1/8 17:17
*/
@ControllerAdvice
public class ExceptionCatch {
private static final Logger logger = LoggerFactory.getLogger(ExceptionCatch.class);
//捕获CustomException异常
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseResult customException(CustomException e) {
ResultCode resultCode = e.getResultCode();
ResponseResult responseResult = new ResponseResult(resultCode);
return responseResult;
}
//使用EXCEPTIONS存放异常类型和错误代码映射 ImmutableMap的特点是一旦创建不可改变 并且线程安全
// 定义map 配置异常类型所对应的错误代码
private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
//定义map的builder对象 去构建ImmutableMap对象
protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();
//使用build来构建一个y异常类型和错误代码异常
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult exception(Exception e) {
if (EXCEPTIONS == null) {
EXCEPTIONS = builder.build(); //EXCEPTIONS构建成功
}
//从EXCEPTIONS中找异常类型所对因的错误代码 如果找到了将错误代码相应给用户 如果找不到响应9999异常
ResultCode resultCode = EXCEPTIONS.get(e.getClass());
if (resultCode != null) {
return new ResponseResult(resultCode);
} else {
return new ResponseResult(CommonCode.SERVER_ERROR);
}
}
static {
builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PARAM);
}
}
测试 抛出异常
前端相应信息