Sonarcloud предупреждает «недостаточно аргументов» при регистрации исключений с использованием SLF4J - PullRequest
1 голос
/ 12 марта 2020

Я управляю проектом с открытым исходным кодом в Java и в моем коде около 20 мест, где я регистрирую исключения, используя следующий шаблон (slf4j версия 1.7.30)

private static final Logger logger = LoggerFactory.getLogger();

... 

try {
  interfaces = NetworkInterface.getNetworkInterfaces(); 
} catch (SocketException ex) {
  logger.error("Socket exception when retrieving interfaces: {}", ex);
}

или аналогично

try {
  // stuff
} catch (IOException ioe) {
  logger.error("Server error: {}", ioe);
}

Начиная с сегодняшнего дня, автоматический анализ качества кода SonarCloud начал помечать их с помощью правила java:S2275 (строки формата в стиле Printf не должны приводить к неожиданному поведению во время выполнения ) с указанным c сообщением «Недостаточно аргументов».

РЕДАКТИРОВАТЬ: Следует отметить, что это, как представляется, последовательно происходит, когда Exception является последним аргументом. Следующий шаблон не flag:

try {
  // Server connection code
} catch (IOException e) {
  logger.error("Server Connection error: {}", e.getMessage());
}

Обзор этого другого вопроса StackOverflow указывает, что, возможно, дополнительный аргумент для исключения является необязательным и приведет к другое поведение, поэтому мне не ясно, как это применимо здесь и почему оно внезапно изменится.

Есть ли что-то, что я могу / должен сделать, чтобы лучше перевести эти исключения в сообщения журнала (например, используйте getMessage() на всех них вместо того, чтобы полагаться на автоматический toString() разбор), или это ложный положительный результат?

(список Сонара моих 20 проблем , связанный здесь .)

1 Ответ

2 голосов
/ 12 марта 2020

Это чисто гипотеза, но каждая из проблем указывает на строку журнала, которая может быть обобщена как:

LOG.something(format, custom_arguments, exception)

, где в формате {} появляется count(custom_arguments) + 1 (1 зарезервировано для исключения) .

Как вы видели связанный ответ , исключения обрабатываются специально с помощью slf4j, поэтому возможно, что по какой-то причине SonarCloud делает то же самое. К сожалению, нет документации.

"Исправление" будет заключаться в удалении окончательного {}, предназначенного для исключения, поэтому, например,

LOG.error("boom: {}", e);
LOG.error("boom2 {}: {}", something, e);

становится

// exceptions handled in a special way
LOG.error("boom", e);
LOG.error("boom2 {}", something, e);
...