簡體   English   中英

在我的Java代碼中,關鍵的SonarLint問題S1166是否是誤報?

[英]Is critical SonarLint issue S1166 in my Java code a false positive or not?

SonarLint 1.0.0 for Eclipse在我的代碼中標記了一個關鍵問題,我無法理解為什么以及如何解決它。 這對我來說真的是假陽性 - 或者我錯過了什么?

import org.apache.log4j.Logger;

[...]

public final class Foo {

    private static final Logger logger = Logger.getLogger(Foo.class);

    [...]

    public static void foo() {

        MyCommand command = new MyCommand(foo, bar);
        try {
            commandService.executeCommand(command);
        } catch (CommandException e) {
            logger.error("My command execution failed", e);
        }
    }

    [...]

以下是匹配的SonarLint規則說明的摘錄:

處理捕獲的異常時,應記錄或傳遞原始異常的消息和堆棧跟蹤。

不合規的代碼示例

\n //不合規 - 異常丟失\n try {/ * ... * /} catch(Exception e){LOGGER.info(“context”);  }   \n\n //不合規 - 異常丟失(僅保留消息)       \n try {/ * ... * /} catch(Exception e){LOGGER.info(e.getMessage());  }\n\n //不合規 - 異常丟失\n try {/ * ... * /} catch(Exception e){throw new RuntimeException(“context”);  }\n

合規解決方案

\n try {/ * ... * /} catch(例外e){LOGGER.info(e);  }   \n\n try {/ * ... * /} catch(Exception e){throw new RuntimeException(e);  }\n\n try {/ * ... * /} catch(RuntimeException e){\n     做一點事();  \n     扔掉;\n } catch(例外e){\n     //也允許轉換為未經檢查的異常\n     拋出新的RuntimeException(e);\n }\n

在我看來,我的代碼符合給定的兼容解決方案的第一個變體,但SonarLint不接受它。

不久之前還有另一個關於Sonar規則S1166討論 ,但它並沒有真正與我有同樣的問題。

編輯:回答以下問題:我使用log4j進行日志記錄。 我擴展了代碼以反映這一點。

實際上,您正在記錄原始異常的消息和堆棧跟蹤; 這是一個錯誤的發現。

可能是規則沒有Log4j的特定知識,但缺乏所有日志庫的全知性,異常作為參數傳遞的事實就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM