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
- Spring核心包自带
方案3:规则抑制(仅适用于特殊场景)
如果业务逻辑确实不需要上层单独处理这类序列化异常,可以添加规则抑制注解跳过当前告警,不推荐优先使用:
@SuppressWarnings("squid:S112") // 抑制「禁止抛出通用异常」规则校验 public void yourMethod() { // 原有业务逻辑 }
内容的提问来源于stack exchange,提问作者Pallavi Singh
相关产品推荐
相关产品推荐

