避免的printStackTrace(); 使用记录器调用,而不是(Avoid printSta

2019-06-24 05:31发布

在我的应用程序,我通过PMD.It运行我的代码显示了我这个消息:

  • 避免的printStackTrace(); 使用记录器调用来代替。

那是什么意思?

Answer 1:

这意味着你应该使用日志框架一样的logback或log4j的和,而不是印刷例外直接:

e.printStackTrace();

你应该使用这个框架API记录他们:

log.error("Ops!", e);

日志框架给你一个很大的灵活性,例如,你可以选择是否要登录到控制台或文件 - 或者,如果你发现他们在某些环境不再相关跳过一些消息。



Answer 2:

如果你调用printStackTrace()在跟踪被写入到一个异常System.err ,很难路由到其它地方(或过滤它)。 相反,这样做的你劝使用日志框架(或周围多个日志框架的包装,如Apache共享日志记录),并登录使用该框架的异常(如logger.error("some exception message", e)

这样做,使您可以:

  • 写日志的语句来一次不同的位置,例如控制台和文件
  • 根据严重性(错误,警告,信息,调试等)和原产地过滤日志报表(通常包或类为主)
  • 对日志格式有一定的影响,而无需更改代码
  • 等等


Answer 3:

生产质量程序应使用的许多记录的替代品之一(例如log4j的,的logback,java.util.logging中)报告错误和其他诊断。 这有很多的优点:

  • 日志消息去配置的位置。
  • 最终用户不会看到的消息,除非你配置日志,让他/她做。
  • 您可以使用不同的记录器和日志记录级别等来控制多一点或者多日志如何记录。
  • 您可以使用不同的appender格式来控制日志记录的样子。
  • 您可以轻松地堵塞日志输出到更大的监控/日志框架。
  • 上述所有可以在不改变你的代码来完成; 通过编辑部署的应用程序的日志记录配置文件IE浏览器。

相反,如果你只是使用的printStackTrace,部署/最终用户,如果任何一点控制和日志信息容易要么被丢失或显示在不适当的情况下,最终用户。 (并没有什么吓坏了胆小的用户不是随机的堆栈跟踪了。)



Answer 4:

在简单,e.printStackTrace()是不好的做法,因为它只是打印出堆栈跟踪标准错误。 正因为如此,你不能真正控制这个地方输出变。



Answer 5:

几乎每一个日志框架提供了其中我们可以通过Throwable对象与消息一起的方法。 喜欢:

public trace(Marker marker, String msg, Throwable t);

他们打印Throwable对象的堆栈跟踪。



Answer 6:

主要的原因是,Proguard的会删除日志从生产要求。 因为记录或打印堆栈跟踪,可以通过例如logcat的阅读器应用程序,看到他们(堆栈跟踪或日志里面的信息)的Android手机里面。 所以这是安全方面有不好的做法。 此外,我们不生产过程中访问它们,这将更好地得到从生产中移除。 由于ProGuard的删除所有记录呼叫没有堆栈跟踪,所以最好使用登录catch块,让他们通过Proguard的退出生产。



文章来源: Avoid printStackTrace(); use a logger call instead