springboot 异常处理-自定义异常及拦截异常
一般解决异常的思路如下
这里我就主要讲讲自定义异常的拦截
为什么要抛自定义异常?
1.service方法在执行过程出现异常在哪捕获?在service中需要都加try/catch,如果在controller也需要添加
try/catch,代码冗余严重且不易维护。
2.在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息
3.将异常以json 数据格式返回,
2.自定义信息响应接口
1.创建一个异常响应接口,需要抛出异常的时候写个继承类就行…
public interface ResultCode {
//操作是否成功,true为成功,false操作失败
boolean success();
//操作代码
int code();
//提示信息
String message();
}
3.自定义异常类
public class CustomException extends RuntimeException {
private ResultCode resultCode;
// 重写构造
public CustomException(ResultCode resultCode){
//异常信息为错误代码+异常信息
super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
this.resultCode = resultCode;
}
//提供获取异常信息的方法
public ResultCode getResultCode() {
return resultCode;
}
}
创建一个抛出异常的工具类
//抛出异常的工具类
public class ExceptionCast {
public static void cast(ResultCode resultCode){
throw new CustomException(resultCode);
}
}
4 . 创建异常捕获类
@ControllerAdvice
public class ExceptionCatch {
//日志打印类
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
//捕获 CustomException异常
@ExceptionHandler(CustomException.class)
@ResponseBody //响应json数据
public ResponseResult customException(CustomException e){
// 打印日志 e.getMessage() 打印自定义抛出的异常信息 也就是 这句 super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);
//获取详细的信息
ResultCode resultCode = e.getResultCode();
//创建响应类,也就是最终传给页面的数据
ResponseResult response = new ResponseResult(resultCode);
return response;
}
}
//创建响应类,也就是最终传给页面的数据
ResponseResult response = new ResponseResult(resultCode); 其实就是对数据的封装
public ResponseResult(ResultCode resultCode){
this.success = resultCode.success();
this.code = resultCode.code();
this.message = resultCode.message();
}
5.异常测试处理
异常类的创建
这里使用的是枚举类型,当然也可以用普通class 实现接口
public enum CmsCode implements ResultCode {
CMS_ADDPAGE_EXISTSNAME(false,24001,"页面名称已存在!"),
CMS_GENERATEHTML_DATAURLISNULL(false,24002,"从页面信息中找不到获取数据的url!"),
CMS_GENERATEHTML_DATAISNULL(false,24003,"根据页面的数据url获取不到数据!"),
CMS_GENERATEHTML_TEMPLATEISNULL(false,24004,"页面模板为空!"),
CMS_GENERATEHTML_HTMLISNULL(false,24005,"生成的静态html为空!"),
CMS_GENERATEHTML_SAVEHTMLERROR(false,24005,"保存静态html出错!"),
CMS_COURSE_PERVIEWISNULL(false,24007,"预览页面为空!");
//操作代码
boolean success;
//操作代码
int code;
//提示信息
String message;
private CmsCode(boolean success, int code, String message){
this.success = success;
this.code = code;
this.message = message;
}
@Override
public boolean success() {
return success;
}
@Override
public int code() {
return code;
}
@Override
public String message() {
return message;
}
//set get 方法省略
}
2.项目使用
if(obj !=null){
//校验对象是否存在,已存在则抛出异常
ExceptionCast.cast(CmsCode.CMS_ADDPAGE_EXISTS);
}
可能有些不太了解枚举的同学可能会奇怪怎么这样写,,,,我一开始也是这样,后来发现
CmsCode.CMS_ADDPAGE_EXISTS // 这句代码
以上是我个人的见解,,如果有什么不对的话,欢迎指出 …谢谢
还没有评论,来说两句吧...