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 Exception
es 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í .)
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);