Является ли критическая проблема SonarLint S1166 в моем коде Java ложным срабатыванием или нет?

SonarLint 1.0.0 для 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:

При обработке перехваченного исключения исходное сообщение об исключении и трассировка стека должны регистрироваться или передаваться вперед.

Пример несовместимого кода

// Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { LOGGER.info("context"); }   

// Noncompliant - exception is lost (only message is preserved)       
try { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }

// Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { throw new RuntimeException("context"); }

Совместимое решение

try { /* ... */ } catch (Exception e) { LOGGER.info(e); }   

try { /* ... */ } catch (Exception e) { throw new RuntimeException(e); }

try {   /* ... */ } catch (RuntimeException e) {
    doSomething();  
    throw e;
} catch (Exception e) {
    // Conversion into unchecked exception is also allowed
    throw new RuntimeException(e);
}

На мой взгляд, мой код подходит для первого варианта данных совместимых решений, но SonarLint его не принимает.

Было еще одно обсуждение правила сонара S1166. немного назад, но на самом деле это не та проблема, которая есть у меня.

Изменить: В ответ на вопрос ниже: Я использую log4j для ведения журнала. Я расширил код, чтобы отразить это.


person anothernode    schedule 01.12.2015    source источник
comment
Какую Logging-Framework вы используете? Возможно, SonarLint не знает вашего фреймворка.   -  person hinneLinks    schedule 01.12.2015
comment
Спасибо за ответ hinneLinks, я использую log4j. Я также изменил исходный вопрос, чтобы включить эту информацию.   -  person anothernode    schedule 01.12.2015
comment
Не имеет прямого отношения, но мне интересно, считает ли Sonar приемлемым LOGGER.error(e), поскольку LOGGER.info(e) соответствует требованиям.   -  person Miserable Variable    schedule 01.12.2015
comment
Привет, Miserable Variable, я пробовал это. Не имеет значения, использую ли я LOGGER.info(e) или LOGGER.error(e).   -  person anothernode    schedule 02.12.2015


Ответы (1)


Фактически, вы регистрируете исходное сообщение об исключении и трассировку стека; это ошибочный вывод.

Может случиться так, что у правила нет конкретных знаний о Log4j, но из-за отсутствия всезнания обо всех библиотеках журналирования, того факта, что исключение передается в качестве параметра, может быть достаточно.

person erickson    schedule 01.12.2015
comment
Я думаю, что ожидать поддержки log4j вполне разумно. Но в любом случае, если он не может претендовать на всеведение, тогда должно быть достаточно, чтобы код делал что-то за исключением - как он может знать иначе? - person robert; 17.02.2016