En mi aplicación, estoy ejecutando mi código a través de PMD y me muestra este mensaje:
- Evite printStackTrace (); utilice una llamada de registrador en su lugar.
Qué significa eso?
En mi aplicación, estoy ejecutando mi código a través de PMD y me muestra este mensaje:
- Evite printStackTrace (); utilice una llamada de registrador en su lugar.
Qué significa eso?
Respuestas:
Significa que debe usar un marco de registro como volver a iniciar sesión o log4j y en lugar de imprimir excepciones directamente:
e.printStackTrace();
debe registrarlos usando la API de este framework:
log.error("Ops!", e);
Los marcos de registro le brindan mucha flexibilidad, por ejemplo, puede elegir si desea iniciar sesión en la consola o en el archivo, o tal vez omitir algunos mensajes si considera que ya no son relevantes en algún entorno.
Si llama printStackTrace()
a una excepción, se escribe el seguimiento System.err
y es difícil enrutarlo a otro lugar (o filtrarlo). En lugar de hacer esto, se le recomienda utilizar un marco de registro (o un contenedor alrededor de varios marcos de registro, como Apache Commons Logging) y registrar la excepción utilizando ese marco (por ejemplo logger.error("some exception message", e)
).
Hacer eso te permite:
Un programa de calidad de producción debe utilizar una de las muchas alternativas de registro (por ejemplo, log4j, logback, java.util.logging) para informar errores y otros diagnósticos. Esto tiene una serie de ventajas:
Por el contrario, si solo usa printStackTrace, el implementador / usuario final tiene poco o ningún control, y los mensajes de registro pueden perderse o mostrarse al usuario final en circunstancias inapropiadas. (Y nada aterroriza más a un usuario tímido que un seguimiento de pila aleatorio).
Casi todos los marcos de registro proporcionan un método en el que podemos pasar el objeto arrojable junto con un mensaje. Me gusta:
public trace(Marker marker, String msg, Throwable t);
Imprimen el trazo de pila del objeto arrojadizo.
Hablemos del concepto de empresa. Log le ofrece niveles flexibles (consulte Diferencia entre logger.info y logger.debug ). Diferentes personas quieren ver diferentes niveles, como QA, desarrolladores, gente de negocios. Pero e.printStackTrace () imprimirá todo. Además, como si este método fuera llamado a descansar, este mismo error puede imprimirse varias veces. Entonces, las personas de Devops o Tech-Ops de su empresa pueden estar locas porque recibirán los mismos recordatorios de error. Creo que podría ser un mejor reemplazo. log.error("errors happend in XXX", e)
Esto también imprimirá toda la información que es más fácil de leer que e.printStackTrace ()
La razón principal es que Proguard eliminaría las llamadas de registro de producción. Porque al iniciar sesión o imprimir StackTrace, es posible verlos (información dentro del seguimiento de la pila o Log) dentro del teléfono Android, por ejemplo, mediante la aplicación Logcat Reader. De modo que es una mala práctica para la seguridad. Además, no accedemos a ellos durante la producción, sería mejor que nos retiraran de la producción. Como ProGuard elimina todas las llamadas de registro, no stackTrace, es mejor usar los bloques de captura de registro y dejar que Proguard los elimine de producción.