全局异常处理器

327 阅读2分钟

全局异常处理器

1.实现统一的返回值

-   success:表示接口是成功还是失败
-   code:错误码,当有异常的时候,可以返回具体的错误码
-   msg:提示信息,比如:操作成功、用户名有误、密码有误等等
-   data:类型是一个泛型,表示任意类型,这个用来存放接口中具体返回的数据,可以是任意类型的对象
/**
 * rest接口通用返回值数据结构
 *
 * @param <T>
 */
public class ResultDto<T> {
    //接口状态(成功还是失败)
    private Boolean success;
    //错误码
    private String code;
    //提示信息
    private String msg;
    //数据
    private T data;
    public Boolean getSuccess() {
        return success;
    }
    public void setSuccess(Boolean success) {
        this.success = success;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    public static <T> ResultDto<T> success(T data) {
        return success(data, "操作成功!");
    }
    public static <T> ResultDto<T> success(T data, String msg) {
        ResultDto<T> result = new ResultDto<>();
        result.setSuccess(Boolean.TRUE);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
    public static <T> ResultDto<T> error(String msg) {
        return error(null,msg);
    }
    public static <T> ResultDto<T> error(String code,String msg) {
        return error(code,msg,null);
    }
    public static <T> ResultDto<T> error(String code, String msg, T data) {
        ResultDto<T> result = new ResultDto<>();
        result.setSuccess(Boolean.FALSE);
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
}

2.统一处理异常

将异常都放到一个地方处理,而不再需要在每个controller方法中进行异常处理。

流程:

定义自定义异常 --> 定义全局异常处理器类 --> 在controller中直接抛出自定义异常的方法让全局异常处理器拦截到后进行处理。

a.自定义异常

/**
 * 业务异常
 */
public class BusException extends RuntimeException {
    //异常错误码
    private String code;
    //错误扩展信息
    private Object data;
    public BusException(String msg) {
        this(null, msg);
    }
    public BusException(String code, String msg) {
        this(code, msg, null);
    }
    public BusException(String code, String msg, Object data) {
        super(msg);
        this.code = code;
        this.data = data;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public static void throwBusException(String msg) {
        throwBusException(null, msg);
    }
    public static void throwBusException(String code, String msg) {
        throwBusException(code, msg, null);
    }
    public static void throwBusException(String code, String msg, Object data) {
        throw new BusException(code, msg, data);
    }
}

b.全局异常统一处理类:GlobalExceptionHandle

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 */
@RestControllerAdvice // @ResponseBody+ControllerAdvice
public class GlobalExceptionHandle {
    /**
     * 统一处理业务异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler(BusException.class)
    public <T> ResultDto<T> doBusException(BusException e) {
        //1、记录错误日志
        //2、返回结果
        return ResultDto.error(e.getCode(), e.getMessage(), (T) e.getData());
    }
    /**
     * 处理其他异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler
    public <T> ResultDto<T> doException(Exception e) {
        //1、记录错误日志
        //2、返回结果
        return ResultDto.error("系统异常,请联系管理员,错误详情:" + e.getMessage());
    }
}

c.controller方法中异常的书写方式

@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 获取用户id
     *
     * @param code
     * @return
     */
    @RequestMapping("/getUserName")
    public ResultDto<String> getUserName(@RequestParam("code") Integer code) {
        if (!Integer.valueOf(6666).equals(code)) {
            //验证码有误的时候,返回4001错误码
            BusException.throwBusException("4001", "验证码有误!");
        }
        return ResultDto.success("成功");
    }
    /**
     * 获取用户id
     *
     * @param code
     * @return
     */
    @RequestMapping("/getUserId")
    public ResultDto<String> getUserId(@RequestParam("code") Integer code) {
        if (!Integer.valueOf(6666).equals(code)) {
            BusException.throwBusException("4001", "验证码有误!");
        }
        return ResultDto.success("成功");
    }
}