java开发中异常的定义,跨系统接收错误码,以及通过code返回枚举

本人目前在做的系统,尤其依赖另外一个系统,在调用另外一个系统时,可能会返回多种报错,如下结构的错误:

	/**
	 * 返回异常结果对象
	 * 
	 * @return
	 */
	public ErrorBean resp(HttpServletResponse resp) {
		if (null != resp) {
			resp.setStatus(this.status);
		}

		return this.errorBean;
	}

即会返回枚举错误的status用来判断是否异常,通过errorBean拿到错误,看一下errorBean的构造来源:

        /**
	 * 缺少必要请求参数
	 */
	MISSING_REQUIRED_PARAMETERS(400, 10001, "missing_required_parameters", "缺少必要请求参数"),
	/**
	 * 非法请求参数
	 */
	ILLEGAL_REQUEST_PARAMETER(400, 10002, "illegal_request_parameter", "非法请求参数"),
	/**
	 * 请求URI不存在
	 */
	URI_NOT_EXIST(404, 10003, "uri_not_exist", "请求URI不存在"),


	/**
	 * HTTP状态码
	 */
	private int status;
	/**
	 * 异常信息对象
	 */
	private ErrorBean errorBean;
	/**
	 * 异常描述
	 */
	public String desc;

	/**
	 * 错误码
	 */
	public int code;

	private ErrorEnum(int status, int errCode, String errMsg, String desc) {
		this.status = status;
		this.errorBean = new ErrorBean(errCode, errMsg);
		this.code = errCode;
		this.desc = desc;
	}
	
/**
 * 异常信息对象
 * @author
 *
 */
public class ErrorBean implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * 异常码
	 */
	private int errCode;
	/**
	 * 异常信息
	 */
	private String errMsg;
	
	public ErrorBean() {}

	public ErrorBean(int errCode, String errMsg) {
		this.errCode = errCode;
		this.errMsg = errMsg;
	}     
        //get set 省略

	@Override
	public String toString() {
		return "ErrorBean [errCode=" + errCode + ", errMsg=" + errMsg + "]";
	}
	
}

 以上也是我常用的异常返回定义,和下面的Result一起构造结果:

package com.xdja.pki.ca.core.common;

import java.io.Serializable;

/**
 * 通用结果实体
 * 
 * @author
 *
 */
public class Result implements Serializable {

	private static final long serialVersionUID = 1L;
	
	/**
	 * 执行结果 0-成功
	 */
	public final static int SUCCESS = 0;
	/**
	 * 业务异常结果(兼容Service层直接返回业务异常枚举情况)
	 */
	public final static int FAILURE = -1;
	
	/**
	 * 执行结果
	 */
	private int code;
	/**
	 * 业务数据
	 */
	private Object info;
	/**
	 * 异常对象
	 */
	private ErrorEnum error;

	/**
	 * 无参构造函数
	 */
	public Result() {}

	/**
	 * 构造函数
	 * 
	 * @param code 错误码
	 * @param info 返回业务数据
	 */
	public Result(int code, Object info) {
		this(code, info, null);
	}
	
	/**
	 * 构造函数
	 * 
	 * @param code 执行结果代码
	 * @param info 返回业务数据
	 * @param error 业务异常枚举
	 */
	public Result(int code, Object info, ErrorEnum error) {
		this.code = code;
		this.info = info;
		this.error = error;
	}
	
	public int getCode() {
		return code;
	}

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

	public Object getInfo() {
		return info;
	}

	public void setInfo(Object info) {
		this.info = info;
	}
	
	public ErrorEnum getError() {
		return error;
	}

	public void setError(ErrorEnum error) {
		this.code = error.code;
		this.error = error;
	}
	

	/**
	 * 是否执行成功
	 * 
	 * @return
	 */
	public boolean isSuccess() {
		return code == SUCCESS;
	}

	/**
	 * 构造成功返回结果
	 * 
	 * @param info 业务数据
	 * @return 结果对象
	 */
	public static Result success(Object info) {
		return new Result(SUCCESS, info);
	}

	/**
	 * 构造成功无业务数据返回结果
	 * 
	 * @return 结果对象
	 */
	public static Result success() {
		return new Result(SUCCESS, null);
	}
	
	/**
	 * 构造失败返回结果
	 * 
	 * @param code 错误码
	 * @return 结果对象
	 */
	public static Result failure(int code) {
        return new Result(code, null);
	}
	
	/**
	 * 构造失败返回结果
	 * 
	 * @param error 业务异常枚举对象
	 * @return
	 */
	public static Result failure(ErrorEnum error) {
		return new Result(FAILURE, null, error);
	}

        //等等 构造方法
	
	@Override
	public String toString() {
		return "Result [code=" + code + ", info=" + info + ", error=" + error + "]";
	}

}

但是当收到别的系统的错误码 也就是errCode+errMsg,如何转化成自己系统的错误码呢?

在这里我建议采取枚举出所有code对应的错误枚举,当然这要求两个系统的错误码不能相同。并且还可以改变为更合理错误码描述,例如:

        /**
	 * 证书已经过期
	 */
	RA_CERT_ISSUE_STATUA_EXPIRED(400, 19025, "cert_has_expired", "CA返回证书已经过期"),
	/**
	 * 证书状态异常
	 */
	RA_CERT_ISSUE_STATUA_EXCEPTION(400, 19024, "cert_status_other", "CA返回证书状态异常"),

        //通过code获取ErrorEnum 
	public static ErrorEnum getErrorEnumByCode(String errCode){
		for(ErrorEnum errorEnum :values()){
			if(StringUtils.equals(String.valueOf(errorEnum.code),errCode)){
				return errorEnum;
			}
		}
		return null;
	}

调用getErrorEnumByCode方法,用code获取对应的枚举:

    //错误码
    String failInfo = String.valueOf(info.getFailInfo().intValue());
    ErrorEnum errorEnumByCode = getErrorEnumByCode(failInfo);
    if (null != errorEnumByCode){
        sdkResult.setError(errorEnumByCode);
    }else if("10001".equals(failInfo)){
        sdkResult.setError(ErrorEnum.CA_ILLEGAL_REQUEST_PARAMETER);
    }else{
        sdkResult.setError(ErrorEnum.CA_OPEN_API_INNER_EXCEPTION);

这样错误码就合理衔接了。

另外一种方案 :在设计之初ErrorEnum 仅放入ErrorBean的两个值,在返回给前端resp的时候set错误码的同时set一个非正常状态status。

两个方案可以中和使用,result在不同时机可以选择set ErrorEnum 或者 ErrorBean。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值