1.5 SpringBoot统一异常处理


返回目录

1.异常情况定义

定义统一异常码

public interface RetCode {
        /**
         * 返回的错误码
         * @return
         */
        int getCode();

        /**
         * 返回的错误信息
         * @return
         */
        String getMessage();

}
public enum ErrorCode implements RetCode {
    SUCCESS(0, "操作成功"),
    SYSTEM_ERR(1, "系统错误,请联系管理员"),
    ;
    private int code;
    private String message;

    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public int getCode() {
        return this.code;
    }

    @Override
    public String getMessage() {
        return this.message;
    }
}
public enum  ErrorCodeBiz implements RetCode {
    SYS_LOGIN_ACCOUNT_PASSWORD_ERROR(101001,"用户名或密码错误"),
    ;
    private int code;
    private String message;
    ErrorCodeBiz(int code,String message){
        this.code = code;
        this.message = message;
    }
    @Override
    public int getCode() {
        return this.code;
    }

    @Override
    public String getMessage() {
        return this.message;
    }
}

定义统一异常

public class BusinessException extends RuntimeException implements RetCode {
    private int code;

    private String message;

    public BusinessException(int code,String message){
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

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

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

通过ExceptionHandler定义异常统一处理方法

@RestControllerAdvice(basePackages = {"com.github.zq84.demo.web"}) // 注意,这里需要添加扫描的包
public class WebResponseHandle {
    private static final Logger log = LoggerFactory.getLogger(WebResponseHandle.class);
    /**
     * 统一异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler({BusinessException.class,  Exception.class})
    public R exceptionHandler(Exception e) {
        if (e instanceof BusinessException) {
            return R.error((BusinessException) e);
        }else {
            e.printStackTrace();
            log.error(e.getMessage());
            return R.error();
        }
    }

}

2. 优化(统一异常封装,减少if/异常判断)

public class Assert {

    /**
     * expression如果为true,表示预期错误信息没有发生,直接继续执行
     *
     * @param expression 布尔表达式
     * @param rc
     */
    public static void check(boolean expression, RetCode rc) {
        if (!expression) {
            throw new BusinessException(rc.getCode(), rc.getMessage());
        }
    }
}

使用范例

/**
     * 当username或password为空时返回错误信息
     * @param params
     * @return
     */
    @PostMapping("/t2")
    public Map<String,Object> hello2(@RequestBody Map<String,String> params) {
        String username = params.get("username");
        String password = params.get("password");
        Assert.check(!StringUtils.isEmpty(username), ErrorCodeBiz.SYS_LOGIN_ACCOUNT_PASSWORD_ERROR);
        Assert.check(!StringUtils.isEmpty(password), ErrorCodeBiz.SYS_LOGIN_ACCOUNT_PASSWORD_ERROR);
        Map<String,Object> map = new HashMap<>();
        map.put("username",username);
        map.put("password", password);
        map.put("data","数据正确");
        return map;
    }

代码链接:https://gitee.com/johnny/learn-demo/tree/master/springboot-demo/boot01-05-common-ex

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值