天天看点

SpringBoot 异常统一处理 + 自定义异常处理

一、通过@ControllerAdvice和@ExceptionHandler实现处理controller层的异常

package com.prison.common.config;

import com.prison.common.entity.MyException;
import com.prison.common.entity.Result;
import com.prison.common.enums.ResultType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author WangJing
 * @Description 异常处理
 * @date 2021/6/18 23:48
 */
@Slf4j
@ControllerAdvice
public class MyControllerAdvice {

    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Result<?> errorHandler(Exception ex) {
        log.error("errorHandler:{}", ex.toString());
        return new Result(ResultType.FAIL, ex.getMessage());
    }

    /**
     * 拦截捕捉自定义异常 MyException.class
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Result<?> myErrorHandler(MyException ex) {
        log.error("myErrorHandler:{}", ex.toString());
        return new Result(ex);
    }

}
           

二、定义自定义异常类

package com.prison.common.entity;

import com.prison.common.enums.ResultType;
import lombok.Data;

/**
 * @author WangJing
 * @Description 自定义异常
 * @date 2021/6/18 0018 23:50
 */
@Data
public class MyException extends RuntimeException {

    private Integer code;

    private String msg;

    public MyException(ResultType resultType) {
        code = resultType.getCode();
        msg = resultType.getMsg();
    }

    public MyException(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

}
           

三、统一返回类型

package com.prison.common.entity;

import com.prison.common.enums.ResultType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @ClassName Result
 * @Description 统一返回类
 * @Author WangJing
 * @Date 2021/6/2 21:54 下午
 * @Version V1.0
 */
@Data
@ApiModel("接口返回对象")
public class Result<T>  {

        @ApiModelProperty("接口响应编码")
        private Integer code;

        @ApiModelProperty("接口响应信息")
        private String msg;

        @ApiModelProperty("接口响应数据")
        private T data;

        public Result(ResultType resultType, T data) {
            code = resultType.getCode();
            msg = resultType.getMsg();
            this.data = data;
        }

        public Result() {
            code = ResultType.SUCCESS.getCode();
            msg = ResultType.SUCCESS.getMsg();
        }

        public Result(ResultType resultType) {
            code = resultType.getCode();
            msg = resultType.getMsg();
        }

        public Result(MyException ex) {
            code = ex.getCode();
            msg = ex.getMsg();
        }

        public Result(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }

}
           

四、统一返回枚举类

package com.prison.common.enums;

/**
 * @ClassName ResultType
 * @Description 返回枚举类
 * @Author WangJing
 * @Date 2021/6/2 22:00 下午
 * @Version V1.0
 */
public enum ResultType {

    SUCCESS(200,"请求处理成功!"),

    FAIL(9001,"请求处理失败!");

    private Integer code;
    private String msg;

    ResultType(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    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;
    }
}
           

五、自定义异常使用:

throw new MyException(ResultType.FAIL);
           

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!