alerta a Sonarcloud "no hay suficientes argumentos" cuando el registro de excepciones usando SLF4J

Daniel Widdis:

Me gestionar un proyecto de código abierto en Java y tienen cerca de 20 lugares en mi código de registro donde excepciones utilizando el siguiente patrón (versión 1.7.30 slf4j)

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

... 

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

o similarmente

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

A partir de hoy, la SonarCloud código de revisión automatizada calidad ha comenzado a marcar estos con la regla java:S2275(cadenas de formato de estilo Printf no deben dar lugar a un comportamiento inesperado en tiempo de ejecución) con el mensaje específico "no hay suficientes argumentos."

EDIT: Es de destacar que esto parece ocurrir constantemente cuando una Exceptiones el argumento final. El siguiente patrón hace no la bandera:

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

Una revisión de esta otra pregunta StackOverflow indica que tal vez un argumento adicional para la excepción es opcional y podría resultar en un comportamiento diferente, así que no me queda claro cómo se aplicaría aquí y por qué de repente cambiaría.

¿Hay algo que puede / debe hacer para traducir mejor estas excepciones para registrar los mensajes (por ejemplo, el uso getMessage()de todos ellos en lugar de confiar en el automatizado toString()de análisis), o se trata de un falso positivo?

(Lista de mis 20 temas de Sónar vinculado aquí .)

Adam Kotwasins sigue:

Esto es pura conjetura, pero cada uno de los temas apunta a una línea de registro que pueden generalizarse como:

LOG.something(format, custom_arguments, exception)

donde formato ha {}apareciendo count(custom_arguments) + 1(el 1 reservado para una excepción).

Como hemos visto la respuesta ligado , las excepciones son tratados especialmente por slf4j, por lo que es posible que debido a alguna razón SonarCloud es hacer la misma cosa. Desafortunadamente no hay ninguna documentación.

La "solución" sería eliminar la final {}destinada a la excepción, así por ejemplo,

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

se convierte

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=276251&siteId=1
Recomendado
Clasificación