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

SonarQube8.9捕获JsonProcessingException抛RuntimeException报通用异常如何解决

问题根因

SonarQube的java:S112(定义并抛出专用异常而非使用通用异常)规则校验的是抛出的异常类型本身,和异常消息、是否携带原始异常栈无关。只要你抛出的是RuntimeException、Exception、Throwable这类通用顶层异常类,无论怎么修改构造参数都会触发告警。

解决方案
  • 方案1:自定义专用业务异常(最推荐)
    先定义贴合业务场景的专用异常类,保留携带异常消息和原始异常的构造方法:
// 自定义JSON序列化专用异常,继承RuntimeException
public class JsonSerializationException extends RuntimeException {
    public JsonSerializationException(String message, Throwable cause) {
        super(message, cause);
    }
}

修改原有catch块的抛出逻辑即可符合规则要求:

try {
    String stringPayload = jsonMapper.writeValueAsString(payload);
    log.info("Feedzai request: {}",<some object>);
    input.setPayload(new StringEntity(stringPayload, APPLICATION_JSON));
} catch (JsonProcessingException e) {
    throw new JsonSerializationException(String.format("JSON序列化处理失败: %s", e.getMessage()), e);
}

该方案既满足Sonar规范要求,也方便上层调用方针对性捕获处理,同时保留了完整原始异常栈便于问题排查。

  • 方案2:复用框架已有的专用异常
    如果项目已引入Spring等成熟框架,可以直接使用框架内置的专用序列化异常,无需额外自定义类:

    • Spring核心包自带org.springframework.core.serializer.support.SerializationFailedException
    • Spring Web包自带org.springframework.http.converter.HttpMessageNotWritableException
  • 方案3:规则抑制(仅适用于特殊场景)
    如果业务逻辑确实不需要上层单独处理这类序列化异常,可以添加规则抑制注解跳过当前告警,不推荐优先使用:

@SuppressWarnings("squid:S112") // 抑制「禁止抛出通用异常」规则校验
public void yourMethod() {
    // 原有业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:27:04