You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SonarQube提示需记录或重抛异常,Java异常处理代码不符合规则如何修复?

问题根因

告警是由第二个catch (Exception e)代码块触发的,你遗漏了原始异常的上下文保留/记录逻辑:

  • 你仅提取了原始异常的getMessage()封装新的ServiceException抛出,没有将原始异常e作为根因传入新异常的构造参数,导致上层捕获异常时会丢失完整的原始调用栈,无法定位问题根源
  • 该分支既没有打印原始异常的日志,也没有正确保留异常上下文,符合Sonar规则「要么记录异常要么正确重抛异常」的告警触发条件

注:第一个捕获ServiceException的分支逻辑是合规的,你既打印了异常栈也原样重抛了异常,不会触发告警。

修复方案

可以根据你的项目异常处理规范二选一:

方案1:补充异常日志记录

如果要求当前层必须打印所有异常日志,直接在该分支补充原始异常的日志打印即可:

public ShippingResponse processShipping(ShippingRequest request) {
    log.debug("Processing Reservation Request ....");
    try{
        return helper.processShippingMethod(request);
    } catch (ServiceException serviceException) {
        log.error(RESERVATION_EXCE, ExceptionUtils.getStackTrace(serviceException));
        throw serviceException;
    } catch (Exception e) {
        // 补充打印原始异常,完整栈信息会被记录
        log.error(ErrorMessages.EPO_SM_ERR_03, e);
        throw new ServiceException(ErrorMessages.EPO_SM_ERR_03, e.getMessage());
    }
}

方案2:保留原始异常上下文(更推荐)

如果上层有统一的异常日志打印逻辑,不需要当前层重复打日志,只需要在构造新的ServiceException时传入原始异常作为根因,保留完整调用栈即可:

public ShippingResponse processShipping(ShippingRequest request) {
    log.debug("Processing Reservation Request ....");
    try{
        return helper.processShippingMethod(request);
    } catch (ServiceException serviceException) {
        log.error(RESERVATION_EXCE, ExceptionUtils.getStackTrace(serviceException));
        throw serviceException;
    } catch (Exception e) {
        // 将原始异常e作为参数传入构造方法,保留完整异常栈
        throw new ServiceException(ErrorMessages.EPO_SM_ERR_03, e);
    }
}

注:需要确认你的自定义ServiceException支持(错误码, 异常根因)、(错误信息, 异常根因)这类双参数构造方法,绝大部分自定义业务异常都会默认实现这类构造。

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:24:04