java - que - Evite printStackTrace(); utilizar una llamada de registrador en su lugar
propagacion de excepciones en java (6)
En mi aplicación, estoy ejecutando mi código a través de PMD. Me muestra este mensaje:
- Evite printStackTrace (); use una llamada de registrador en su lugar.
Qué significa eso?
Casi todos los marcos de registro proporcionan un método por el cual podemos pasar el objeto arrojado junto con un mensaje. Me gusta:
public trace(Marker marker, String msg, Throwable t);
Imprimen la pila de pila del objeto arrojadizo.
En Simple, e.printStackTrace () no es una buena práctica, ya que simplemente imprime el seguimiento de la pila en un error estándar. Debido a esto, no puedes controlar a dónde va esta salida.
La razón principal es que Proguard eliminará las llamadas de registro de la producción. Porque al iniciar sesión o al imprimir StackTrace, es posible verlos (información dentro del seguimiento de 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 eliminarlos de la producción. Como ProGuard elimina todas las llamadas de registro no stackTrace, por lo que es mejor utilizar Iniciar sesión capturar bloques y dejarlos eliminados de Producción por Proguard.
Si llama a printStackTrace()
en una excepción, el rastreo se escribe en System.err
y es difícil System.err
a otra parte (o filtrarlo). En lugar de hacer esto, se le aconseja usar un marco de trabajo (o un envoltorio alrededor de múltiples marcos de registro, como Apache Commons Logging) y registrar la excepción usando ese marco (ej. logger.error("some exception message", e)
).
Hacer eso te permite:
- escriba la declaración de registro en diferentes ubicaciones a la vez, por ejemplo, la consola y un archivo
- filtrar las instrucciones de registro por severidad (error, advertencia, información, depuración, etc.) y origen (normalmente basado en paquete o clase)
- tener alguna influencia en el formato de registro sin tener que cambiar el código
- etc.
Significa que debe usar la estructura de registro como logback o log4j y en lugar de imprimir excepciones directamente:
e.printStackTrace();
deberías iniciar sesión 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 archivo, o tal vez omitir algunos mensajes si considera que ya no son relevantes en algún entorno.
Un programa de calidad de producción debe usar 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:
- Los mensajes de registro van a una ubicación configurable.
- El usuario final no ve los mensajes a menos que configure el registro para que lo haga.
- Puede usar diferentes registradores y niveles de registro, etc. para controlar la cantidad de registro que se registra.
- Puede usar diferentes formatos de anexos para controlar cómo se ve el registro.
- Puede conectar fácilmente la salida de registro en un marco de monitoreo / registro más grande.
- Todo lo anterior se puede hacer sin cambiar su código; es decir, editando el archivo de configuración de registro de la aplicación implementada.
Por el contrario, si solo usa printStackTrace, el usuario final / implementador tiene poco o ningún control, y los mensajes de registro pueden perderse o mostrarse al usuario final en circunstancias inapropiadas. (Y nada aterroriza a un usuario tímido más que a un rastro de pila aleatorio).