分布式项目中的统一异常处理

分布式项目中的统一异常处理

1.自定义异常处理类并继承runtimeexception
2.自定义统一异常处理类处理各类自定义异常处理类(但是此处作为公共项目,不贴自动增强注解@ControllerAdvice,单独每个服务继承此公共异常处理类并做增强处理,比较灵活)
3.虽然各个服务都能实现本服务的统一异常处理,但是结合整个项目来看,为了方便快速找出项目中是哪个服务出现了异常,所以需要相应标示来区分
4.自定义封装异常返回对象其中包括异常编码对应不同服务的不同异常错误(500101,500102,600100等),异常信息

公用项目信息中

封装异常对象信息

@Setter
@Getter
public class CodeMsg {
    private int code ;
    private String msg ;

    public CodeMsg(int code,String msg){
        this.code=code;
        this.msg=msg;
    }
}

自定义业务逻辑异常处理类

@Getter
@Setter
public class BusinessException extends RuntimeException{
    private CodeMsg codeMsg ;

    public BusinessException(CodeMsg codeMsg){
        this.codeMsg=codeMsg;
    }
}

定义统一异常处理类

public class CommExceptionAdvice{
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public JsonResult handle(BusinessException e){
        e.printStackTrace();
        return new JsonResult(e.getCodeMsg(),null);
    }
}

特定项目中

自定义本项目中的异常信息,及其异常类型

public class MemberCodeMsg extends CodeMsg {

    public static final MemberCodeMsg PHONE_ERROR = new MemberCodeMsg(500100,"手机号码不能为空" );
    public static final MemberCodeMsg PASSWORD_ERROR = new MemberCodeMsg(500101,"亲,密码不能为空" );
    public static final MemberCodeMsg REPASSWORD_ERROR = new MemberCodeMsg(500102,"亲,确认密码不能为空" );
    public static final MemberCodeMsg NICKNAME_ERROR = new MemberCodeMsg(500103,"亲,昵称不能为空" );
    public static final MemberCodeMsg EQUALSPASSWORD_ERROR = new MemberCodeMsg(500104,"二次输入的密码不一致" );
    public static final MemberCodeMsg HASE_REGIST_ERROR = new MemberCodeMsg(500105,"号码已经存在" );


    public MemberCodeMsg(int code, String msg) {
        super(code, msg);
    }
}

本项目中做统一异常处理

@ControllerAdvice
public class MemberException extends CommExceptionAdvice {
        //针对menber-server做统一异常处理
}

调用实例

public JsonResult regist(String phone, String password, String nickname, String rpassword) {
        //传入参数不能为空
        AssertUtil.hasLength(phone, MemberCodeMsg.PHONE_ERROR);
        AssertUtil.hasLength(password, MemberCodeMsg.PASSWORD_ERROR);
        AssertUtil.hasLength(rpassword, MemberCodeMsg.REPASSWORD_ERROR);
        AssertUtil.hasLength(nickname, MemberCodeMsg.NICKNAME_ERROR);
        //验证二次密码是否一致
        AssertUtil.isEquals(password, rpassword, MemberCodeMsg.EQUALSPASSWORD_ERROR);
        //验证手机号码是否唯一
        if (userInfoService.checkPhone(phone)) {
            throw new BusinessException(MemberCodeMsg.HASE_REGIST_ERROR);
        }
}

-----------------------------------------
    public class AssertUtil {
    private AssertUtil(){};

    public static void hasLength(String value ,CodeMsg codeMsg){
        if(!StringUtils.hasLength(value)){
            throw new BusinessException(codeMsg);
        }
    }
    public static void isEquals(String password, String rpassword,CodeMsg codeMsg) {
        if(!password.equals(rpassword)){
            throw new BusinessException(codeMsg);
        }
    }
}

版权声明:本文为weixin_47057820原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。