Spring @ControllerAdvice+@ExceptionHandler統一異常處理

一起碼程式碼發表於2020-11-12

編寫返回介面格式:

public interface ResultCode {

    public static Integer SUCCESS = 200; //成功

    public static Integer ERROR = 201; //失敗
}
@Data
public class R {

    
    private Boolean success;

    
    private Integer code;

    
    private String message;

   
    private Map<String, Object> data = new HashMap<String, Object>();

    //把構造方法私有
    private R() {}

    //成功靜態方法
    public static R ok() {
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    //失敗靜態方法
    public static R error() {
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失敗");
        return r;
    }

    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }

    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}

全域性異常

@ControllerAdvice
public class GlobalExceptionHandler {

    //指定出現什麼異常執行這個方法
    @ExceptionHandler(Exception.class)
    @ResponseBody //為了返回資料
    public R error(Exception e) {
        e.printStackTrace();
        return R.error().message("執行了全域性異常..");
    }
}

只要controller中發生了@ExceptionHandler()中的異常就會執行這個方法。

自定義異常

編寫自定義異常類

@Data
@AllArgsConstructor  //生成有引數構造方法
@NoArgsConstructor   //生成無引數構造
public class EduException extends RuntimeException {
    private Integer code;//狀態碼
    private String msg;//異常資訊
}

引入自定義異常:

@ControllerAdvice
public class GlobalExceptionHandler {

    //自定義異常
    @ExceptionHandler(EduException.class)
    @ResponseBody //為了返回資料
    public R error(EduException e) {
        log.error(e.getMessage());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }

}

捕獲異常時丟擲自定義異常

	try {
            Page<EduTeacher> teacherPage = new Page<>(current, limit);
            eduTeacherService.page(teacherPage, null);
            int i = 10 / 0;
            long total = teacherPage.getTotal();
            List<EduTeacher> eduTeachers = teacherPage.getRecords();
            return R.ok().data("total", total).data("rows", eduTeachers);
        }catch (Exception e){
            throw  new EduException(201,"自定義異常");
        }

幫助到您請點贊關注收藏謝謝!!

相關文章