异常处理概述

创建自定义异常处理类

系统自带的Exception比较简单,在现有的基本上,添加异常状态码,这里继续继承的是RuntimeException而非Exception:

import com.example.server.enums.CodeEnum;

public class CustomException extends RuntimeException{
    private Integer code;

    public GirlException(CodeEnum codeEnum) {
        super(codeEnum.getMsg());
        this.code = codeEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

拦截控制器异常

创建一个异常处理类,并加处@ExceptionHandler注解:

import com.example.server.object.ResultObject;
import com.example.server.utils.ResultUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResultObject handle(Exception e) {
        if (e instanceof CustomException) {
            CustomException ce = (CustomException) e;
            return ResultUtils.error(ce.getCode(), ce.getMessage());
        } else {
            return ResultUtils.error(404, "未知错误");
        }
    }
}

创建异常统返回格式及正常与错误返回状态

统一的返回格式:

public class ResultObject {
    private Integer code;
    private String msg;
    private Object data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResultObject{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

成功与失败的统一输出:

package com.example.server.utils;

import com.example.server.object.ResultObject;

public class ResultUtils {

    public static ResultObject success(Object data) {
        ResultObject resultObject = new ResultObject();
        resultObject.setCode(0);
        resultObject.setMsg("SUCCESS");
        resultObject.setData(data);
        return resultObject;
    }

    public static ResultObject success() {
        return success(null);
    }

    public static ResultObject error(Integer code, String message) {
        ResultObject resultObject = new ResultObject();
        resultObject.setCode(code);
        resultObject.setMsg(message);
        return resultObject;
    }
}