springboot 异常处理-自定义异常及拦截异常

一般解决异常的思路如下 

《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.异常测试处理

 1. 异常类的创建

 这里使用的是枚举类型,当然也可以用普通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  // 这句代码 

 

 《springboot 异常处理-自定义异常及拦截异常》

以上是我个人的见解,,如果有什么不对的话,欢迎指出 …谢谢

    原文作者:xyang_1128
    原文地址: https://blog.csdn.net/qq_40794266/article/details/84347190
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞