记录此异常并处理它,或者使用一些上下文信息重新抛出它

Kri*_*ish 3 java spring-boot sonarlint

有人可以帮我解释为什么 SonarLint 会显示这个:

要么记录此异常并处理它,要么使用一些上下文信息重新抛出它。

对于下面的代码。

public static <T> T getObjectFromJson(final Object jsonString, final Class<T> valueType) {
        T object = null;
        if (jsonString != null) {
            try {
                object = MAPPER.readValue(jsonString.toString(), valueType);
            } catch (IOException io) {
                log.error(ERROR_LOG_STR + " in method getObjectFromJson(). Exception Message={}, Exception Stack ={}",
                        io.getMessage(), io);
                throw new ServiceException(ErrorMessages.JSON_SERIALIZATION_ERROR, io.getCause());
            }
        }
        return object;
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

hc_*_*dev 6

这是关于...请参阅 Sonar 的规则规范 RSPEC-2139

\n
\n

异常应该被记录或重新抛出,但不能两者都记录

\n
\n

为了遵守规则,请决定:

\n
    \n
  1. 仅记录:
  2. \n
\n
            try {\n                object = MAPPER.readValue(jsonString.toString(), valueType);\n            } catch (IOException io) {\n                log.error(ERROR_LOG_STR + " in method getObjectFromJson(). Exception Message={}, Exception Stack ={}",\n                        io.getMessage(), io);\n            }\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 或仅抛出:
  2. \n
\n
           try {\n               object = MAPPER.readValue(jsonString.toString(), valueType);\n           } catch (IOException io) {\n               throw new ServiceException(ErrorMessages.JSON_SERIALIZATION_ERROR, io);  // would use the full exception, not only the wrapped .getCause()\n           }\n
Run Code Online (Sandbox Code Playgroud)\n

奖励:如何实现两者并简化

\n

您还可以另外登录全局或本地错误处理拦截器,例如 Spring@ControllerAdvice带注释的错误处理程序。

\n

Throwable大多数记录器允许在错误级别记录时传递 a 。\n例如使用Slf4jlog.error(ERROR_LOG_STR + " in method getObjectFromJson(): " + io.getMessage(), io)

\n

也可以看看:

\n\n

相关规则

\n

RSPEC-1166:异常处理程序应保留原始异常

\n

规范功能于 2018 年 11 月 2 日在版本 5.9 中得到解决,Java 的实现于 2019 年 2 月 15 日在版本 5.11 中得到修复。

\n

\xe2\x9a\xa0\xef\xb8\x8f 仅部分修复:\n标记的重复\n和obourgain\ 的答案不能完全解决这里的双重情况:

\n
    \n
  1. 他们修复了 RSPEC-1166
  2. \n
  3. 但不是 RSPEC-2139
  4. \n
\n

应对 RSPEC-1166 的类似问题:

\n\n