全局统一异常处理器

软件开发springboot项目过程中,不可避免的需要处理各种异常,spring mvc 架构中各层会出现大量的try {...} catch {...} finally {...}代码块,不仅有大量的冗余代码,而且还影响代码的可读性。这样就需要定义个全局统一异常处理器,以便业务层再也不必处理异常。

实现:

目录

1、封装统一返回结果类

2、自定义异常封装类

3、错误枚举

4、全局异常处理类

5、测试


1、封装统一返回结果类

import com.jiusen.exercise.enums.ErrorEnum;
import com.jiusen.exercise.exception.BusinessException;
import lombok.Getter;
import lombok.Setter;

/**
 * @author: Lawson
 * @date: 2021/5/11
 * @description: TODO 统一的返回结果
 */
@Getter
@Setter
public class AjaxResult {

    //是否成功
    private Boolean success;
    //状态码
    private Integer code;
    //提示信息
    private String msg;
    //数据
    private Object data;

    public AjaxResult() {
    }

    //自定义返回结果的构造方法
    public AjaxResult(Boolean success, Integer code, String msg, Object data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    //自定义异常返回的结果
    public static AjaxResult defineError(BusinessException de) {
        AjaxResult result = new AjaxResult();
        result.setSuccess(false);
        result.setCode(de.getErrorCode());
        result.setMsg(de.getErrorMsg());
        result.setData(null);
        return result;
    }

    //其他异常处理方法返回的结果
    public static AjaxResult otherError(ErrorEnum errorEnum){
        AjaxResult result = new AjaxResult();
        result.setMsg(errorEnum.getErrorMsg());
        result.setCode(errorEnum.getErrorCode());
        result.setSuccess(false);
        result.setData(null);
        return result;
    }
}

2、自定义异常封装类

import lombok.Getter;
import lombok.Setter;

/**
 * @author: Lawson
 * @date: 2021/5/11
 * @description: TODO 类描述
 */
@Getter
@Setter
public class BusinessException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    /**
     * 错误状态码
     */
    protected Integer errorCode;
    /**
     * 错误提示
     */
    protected String errorMsg;

    public BusinessException() {
    }

    public BusinessException(String message, Integer errorCode, String errorMsg) {
        super(message);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
}

3、错误枚举

**
 * @author: Lawson
 * @date: 2021/5/11
 * @description: TODO 类描述
 */
public enum  ErrorEnum {
    //数据操作错误定义
    SUCCESS(200, "成功"),
    NO_PERMISSION(403, "你无权访问"),
    NO_Auth(401, "未授权,请登录验证"),
    NO_FOUND(404, "未找到资源"),
    INTERNAL_SERVER_ERROR(500, "服务器异常, 请联系管理员!");


    /**
     * 错误码
     */
    private Integer errorCode;
    /**
     * 错误信息
     */
    private String errorMsg;

    ErrorEnum(Integer errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

4、全局异常处理类

import com.jiusen.exercise.enums.ErrorEnum;
import com.jiusen.exercise.exception.BusinessException;
import com.jiusen.exercise.rest.AjaxResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * @author: Lawson
 * @date: 2021/5/11
 * @description: TODO 类描述
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    public AjaxResult bizExceptionHandler(BusinessException e) {
        log.error(e.getErrorMsg(), e);
        return AjaxResult.defineError(e);
    }

    /**
     * 处理其它异常
     */
    @ExceptionHandler(value = Exception.class)
    public AjaxResult exceptionHandler(Exception e) {
        log.error(e.getMessage(), e);
        return AjaxResult.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
    }
}

5、测试

/**
 * @author: Lawson
 * @date: 2021/5/11
 * @description: TODO 类描述
 */
@RestController
@RequestMapping("test")
public class TestController {

    @RequestMapping("query")
    public Object query() {
        throw new BusinessException(ErrorEnum.NO_PERMISSION.getErrorMsg(), ErrorEnum.NO_PERMISSION.getErrorCode(), ErrorEnum.NO_PERMISSION.getErrorMsg());
    }
}

全局统一异常处理器_第1张图片

全局统一异常处理器_第2张图片

你可能感兴趣的:(Spring,Boot,springboot,异常)