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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章