Pregunta

Estoy usando el analizador de código estático Enerjy ( http://www.enerjy.com/ ) herramienta en mi código Java. Me dice que la siguiente línea:

System.err.println (" Ignorado esa base de datos ");

es malo porque usa System.err. El error exacto es: & Quot; JAVA0267 Uso de System.err & Quot;

¿Qué tiene de malo usar System.err?

¿Fue útil?

Solución

Respuesta corta: se considera una mala práctica usarlo para fines de registro.

Es una observación de que en los viejos tiempos cuando no había marcos de registro ampliamente disponibles / aceptados, todos usaban System.err para imprimir mensajes de error y apilar rastros en la consola. Este enfoque puede ser apropiado durante la fase de desarrollo y prueba local, pero no es apropiado para un entorno de producción, ya que puede perder importantes mensajes de error. Debido a esto, en casi todas las herramientas de análisis estático hoy en día este tipo de código se detecta y marca como mala práctica (o un problema con un nombre similar).

Los marcos de registro a su vez proporcionan la forma estructurada y lógica de registrar sus eventos y mensajes de error, ya que pueden almacenar el mensaje en varias ubicaciones persistentes (archivo de registro, registro db, etc.).

La resolución más obvia (y sin dependencias externas) de hack es utilizar el marco de registro de Java integrado a través de la clase java.util.logging.Logger, ya que reenvía los eventos de registro a la consola de forma predeterminada. Por ejemplo:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(o simplemente puede desactivar esa opción de análisis)

Otros consejos

el descriptor de su error es:

  

El uso de System.err puede indicar depuración residual o código repetitivo. Considere usar un   paquete de registro completo como Apache Commons para manejar el registro de errores.

Parece que está utilizando System.err para fines de registro, lo que no es óptimo por varias razones:

  • es imposible habilitar el registro en tiempo de ejecución sin modificar el binario de la aplicación
  • el comportamiento de registro no se puede controlar editando un archivo de configuración
  • probablemente muchos otros

Si bien estoy de acuerdo con los puntos anteriores sobre el uso de un marco de registro, todavía tiendo a usar la salida System.err en un solo lugar: dentro de los ganchos de apagado. Esto se debe a que descubrí que cuando se usan las java.util.logging instrucciones de registro de marco no siempre se muestran si ocurren en ganchos de apagado. Esto se debe a que la biblioteca de registro presumiblemente contiene su propio enlace de apagado para limpiar los archivos de registro y otros recursos, y como no puede confiar en el orden en que se ejecutan los enlaces de cierre, no puede confiar en que las declaraciones <=> funcionen como se esperaba.

Consulte este enlace (la sección " Comentarios ") para obtener más información al respecto.

http://weblogs.java.net/blog/ dwalend / archive / 2004/05 / shutdown_hooks_2.html

(Obviamente, la otra alternativa es usar un marco de registro diferente).

System.err es realmente más para propósitos de depuración que cualquier otra cosa. Se prefiere el manejo adecuado de excepciones y el manejo de errores de una manera que sea más fácil de usar. Si el usuario debe ver el error, use un System.out.println en su lugar.

Si desea realizar un seguimiento de esos errores desde el punto de vista del desarrollador, debe usar un registrador.

Las cosas escritas en System.err generalmente se pierden en el tiempo de ejecución, por lo que se considera una mejor práctica usar un marco de registro que sea más flexible sobre dónde enviar el mensaje, para que pueda almacenarse como un archivo y analizarse.

System.err y System.out para aplicaciones que no son de consola solo las ve el desarrollador que ejecuta el código en su IDE, y la información útil puede perderse si el elemento se activa en producción.

System.err.println y System.out.println no deben usarse como interfaz de registro. STD-Output y STD-Error (estos están escritos por System.out y .err) son para mensajes de herramientas de línea de comandos.

System.err se imprime en la consola. Esto puede ser adecuado para un estudiante que prueba su tarea, pero no será adecuado para una aplicación donde estos mensajes no se verán (la consola solo almacena tantas líneas).

Un mejor enfoque sería lanzar una excepción que contenga el mensaje que normalmente se enviaría a la consola. Una alternativa a esto sería utilizar un software de registro de terceros que almacenaría estos mensajes en un archivo que se puede almacenar para siempre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top