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

这篇博客探讨了在系统交互中如何处理来自外部系统的错误码,提出了两种策略:一是建立枚举映射,将接收到的错误码映射到自定义的错误枚举,确保错误描述的一致性和合理性;二是利用状态码配合错误信息,提供更丰富的错误信息。通过示例代码展示了如何实现这两种策略,并强调了错误码设计的重要性。
摘要由CSDN通过智能技术生成

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

/**

* 返回异常结果对象

*

* @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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值