在业务代码中,统计使用异常来结束流程,不要使用 if(条件) return error 这种方式

    具体的编码示例:

    1. AlarmConfig alarmConfig = repository.findById(id);
    2. if (null == alarmConfig) {
    3. //使用异常来结束流程
    4. throw new ObootException(CommonErrorCode.DATA_SELECT_FAIL);
    5. }
    6. //也可以使用断言,显的代码更为简洁
    7. AssertUtil.isNotNull(fixedBill, CommonErrorCode.DATA_SELECT_FAIL, "票据号{} 查询失败", id);

    CommonErrorCode 错误码是会在每个系统中独一份,如果需要前端感知为什么失败,则需要自行定义
    目前有的共用如下:

    public enum CommonErrorCode implements IErrorCode {
        /** 处理成功 */
        SUCCESS("001", "处理成功", "处理成功", ErrorLevel.INFO, ErrorType.BIZ),
    
        /** 未知异常 */
        UNKNOWN_ERROR("002", "未知异常", "呃,出错了,请联系管理员", ErrorLevel.WARN, ErrorType.BIZ),
    
        /** 非法参数 */
        ILLEGAL_PARAMETERS("003", "非法参数", "请检查下你输入的参数是否正确哦~", ErrorLevel.INFO, ErrorType.BIZ),
    
        /** 系统错误 */
        SYSTEM_ERROR("004", "系统错误", "呃,出错了,请联系管理员", ErrorLevel.ERROR, ErrorType.SYSTEM),
    
        /** 重复提交错误 */
        REPEATED_SUBMIT("005", "重复提交", "请勿重复提交", ErrorLevel.WARN, ErrorType.BIZ),
    
        /** 非法操作 */
        ILLEGAL_OPERATION("006", "非法操作", "非法操作哦!", ErrorLevel.WARN, ErrorType.BIZ),
    
        /** 服务调用异常 */
        RPC_ERROR("010", "服务调用异常", "服务调用异常", ErrorLevel.ERROR, ErrorType.SYSTEM),
    
        /** 数据查询失败 */
        DATA_SELECT_FAIL("012", "DATA_SELECT_FAIL", "数据查询失败 ", ErrorLevel.INFO, ErrorType.BIZ),
    
        /** 数据检查失败 */
        DATA_CHCEK_FAIL("013", "DATA_CHCEK_FAIL", "数据检查失败 ", ErrorLevel.INFO, ErrorType.BIZ),
    
        /** 数据被占用 */
        DATA_CHCEK_EXIST("014", "DATA_CHCEK_EXIST", "数据被占用 ", ErrorLevel.ERROR, ErrorType.BIZ),
    
        /** session过期 */
        SESSION_EXPIRED("015", "SESSION_EXPIRED", "会话过期", ErrorLevel.INFO, ErrorType.BIZ),
        SESSION_EXPIRATION("401", "SESSION_EXPIRATION", "您的会话已过期,需要重新登录!", ErrorLevel.INFO, ErrorType.BIZ),
        ;
    
    }
    

    通过以上代码可以看出,异常是有:ErrorLevel,ErrorType 错误级别与错误类型
    在大行的系统里,合理的定义好错误级别与错误类型有利于系统异常日志的分析

    if (ex instanceof ObootException) {
        ObootException e = (ObootException) ex;
        buildFailResult(result, e);
        IErrorCode errorCode = e.getErrorCode();
        event.setErrorCode(errorCode);
    
        // 这里需要看是系统异常还是业务异常
        String errorLevel = errorCode.getErrorLevel();
        if (StringUtils.equals(ErrorLevel.ERROR, errorLevel)) {
            LoggerUtil.error(e, "操作失败:{}", e.getMessage());
        } else {
            // 不输出堆栈信息
            LoggerUtil.error("操作失败:{}", e.getMessage());
        }
    }
    

    通过这断代码可以看出来,可以通过错误类型,来区分是否输出异常堆栈信息,一些业务检查类,其实没有必要输出异常堆栈信息。这样我们通过 common-error.log 这个日志文档,才能看到真实有的效信息

    错误码,需要:系统前缀+错误类型+错误级别+错误场景+具体错误码组成,这样在日志采集时,就能分析出具体的位置。

    在微服务场景下,一个异常出现时,要把异常信息带上,在调用方能清楚知道是哪个系统出现问题了。