记录一下自己对项目中异常的处理封装,通用组件
总的exception包含三个类
1. BaseAppException
public class BaseAppException extends BaseException { public BaseAppException() { super(); } public BaseAppException(String errorMessage) { super(errorMessage); } public BaseAppException(ResponseStatus responseStatus) { super(responseStatus); } public BaseAppException(ResponseStatus responseStatus, Throwable cause) { super(responseStatus, cause); } public BaseAppException(String errorMessage, BaseAppException e) { super(errorMessage, e); } public BaseAppException(Throwable cause) { super(cause); } public BaseAppException(String errorCode, String errorMessage) { super(errorCode,errorMessage); }
2. BaseErrException
public class BaseErrException extends BaseException { private static final long serialVersionUID = 1L; public BaseErrException(String errorMessage) { super(errorMessage); } public BaseErrException(String errorMessage, BaseErrException e) { super(errorMessage, e); } public BaseErrException(Throwable cause) { super(cause); } }
3.BaseException
public abstract class BaseException extends RuntimeException { private static final long serialVersionUID = 1L; /** * 错误码 */ private String errorCode; /** * 错误描述 */ private String errorMessage; /** * 异常触发原因 */ private Throwable cause; public BaseException() { } public BaseException(String errorMessage) { this.cause = new Throwable(errorMessage); this.errorMessage = errorMessage; this.errorCode = ResponseStatus.FAIL_COMMOM.code; } public BaseException(ResponseStatus responseStatus) { this.errorCode = responseStatus.code; this.errorMessage = responseStatus.msg; this.cause = new Throwable(responseStatus.msg + ". [errCode:" + responseStatus.code + "]"); } public BaseException(ResponseStatus responseStatus, Throwable cause) { this.errorCode = responseStatus.code; this.errorMessage = responseStatus.msg; this.cause = cause; } public BaseException(String errorMessage, BaseException e) { String causeErrMsg = ""; if(null != e) { if (null != e.getCause()) { causeErrMsg = " Caused by :" + e.getCause().getMessage(); } this.errorCode = e.getErrorCode(); this.errorMessage = errorMessage + causeErrMsg; this.cause = e.getCause(); } else { this.errorMessage = errorMessage; this.errorCode = ResponseStatus.FAIL_COMMOM.code; this.cause = new Throwable(errorMessage + "[errCode:" + ResponseStatus.FAIL_COMMOM.code + "]"); } } public BaseException(Throwable cause) { super(cause); } public BaseException(String errorCode, String errorMessage) { // super(showMessage); this.errorMessage = errorMessage; this.errorCode = errorCode; } public String getErrorCode() { return errorCode; } @Override public Throwable getCause() { return cause; } public void setCause(Throwable cause) { this.cause = cause; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } /** * Description:获取异常信息 * * @return */ @Override public String getMessage() { String msg = super.getMessage(); String causeMsg = null; if (this.cause != null) { causeMsg = this.cause.getMessage(); } if (msg != null) { if (causeMsg != null) { return msg + " caused by: " + causeMsg; } return msg; } return causeMsg; } }
3. ResponseStatus 枚举
public enum ResponseStatus { // 成功 SUCCESS("S0001","成功"), // 成功,结果为空 SUCCESS_RESULT_IS_NULL("S0002","结果为空"), /** * 编码 */ public String code; /** * 信息 */ public String msg; ResponseStatus(String code, String msg) { this.code = code; this.msg = msg; }
2. 上面的异常,在service、dao、一直向上层抛出,到web中,返回接住
@Override public CategoryRes insertory(CateyReq req) { XXXXX logger.info("新增类目,param={}", req); CategoryRes res = new CategoryRes(); try { CategoryVo vo = this.handleInsertParam(req); // 保存数据 categoryService.insertCategory(vo); // 返回保存后数据 的id res.setCategoryExVo(new CategoryExVo(vo.getId())); } catch (Exception e) { res = new CategoryRes(ExceptionUtils.handleException(new Exception(e), info)); } finally { Profiler.registerInfoEnd(info); } return res; }
ExceptionUtils.handleException 的信息
public CategoryRes(Result result) {
this.result = result;
}
统一的返回结果Result
public class Result implements Serializable{ /** * 结果标志 */ private boolean isSuccess; /** * 结果码 */ private String code; /** * 结果信息描述 */ private String msg; public Result(){ } /** * 未发生异常 * @param rpcStatus */ public Result(RpcStatus rpcStatus) { this.code = rpcStatus.getCode(); this.msg = rpcStatus.getMsg(); this.setSuccess(RpcStatus.FAIL != rpcStatus); } /** * 发生程序补获并处理的异常(RpcException)时,errCode, errMessage * @param e */ public Result(RpcException e) { this.code = e.getErrorCode(); this.msg = e.getErrorMessage(); this.setSuccess(false); } /** * 自定义 * @param code * @param msg */ public Result(String code, String msg) { this.code = code; this.msg = msg; this.setSuccess(false); } public boolean isSuccess() { return isSuccess; } public void setSuccess(boolean success) { isSuccess = success; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
public class ExceptionUtils { private final static Logger logger = LoggerFactory.getLogger(ExceptionUtils.class); /** * 分析处理RpcException * @param e * @param info * @return */ public static final Result handleException(Exception e, CallerInfo info) { Throwable cause = null; if (e.getCause() != null) { cause = e.getCause(); } else { cause = e; } if (cause.getClass().equals(BaseAppException.class)) { // BaseAppException 逻辑判断不通过 BaseAppException e1 = (BaseAppException) e.getCause(); return new Result(new RpcException(e1.getErrorCode(), e1.getErrorMessage())); } else if (cause.getClass().equals(BaseErrException.class)) { // BaseErrException 捕获到的异常 BaseErrException e1 = (BaseErrException) e.getCause(); return new Result(e1.getErrorCode(), e1.getErrorMessage()); } else { // 未知异常 if (null != info) { Profiler.functionError(info); } return new Result(new RpcException(RpcStatus.FAIL.code, RpcStatus.FAIL.msg)); } } }
标签:
【茶话心得】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构