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 для ведения журнала. Я расширил код, чтобы отразить это.
LOGGER.error(e)
, посколькуLOGGER.info(e)
соответствует требованиям. - person Miserable Variable   schedule 01.12.2015LOGGER.info(e)
илиLOGGER.error(e)
. - person anothernode   schedule 02.12.2015