在我的应用程序,我通过PMD.It运行我的代码显示了我这个消息:
- 避免的printStackTrace(); 使用记录器调用来代替。
那是什么意思?
在我的应用程序,我通过PMD.It运行我的代码显示了我这个消息:
- 避免的printStackTrace(); 使用记录器调用来代替。
那是什么意思?
这意味着你应该使用日志框架一样的logback或log4j的和,而不是印刷例外直接:
e.printStackTrace();
你应该使用这个框架API记录他们:
log.error("Ops!", e);
日志框架给你一个很大的灵活性,例如,你可以选择是否要登录到控制台或文件 - 或者,如果你发现他们在某些环境不再相关跳过一些消息。
如果你调用printStackTrace()
在跟踪被写入到一个异常System.err
,很难路由到其它地方(或过滤它)。 相反,这样做的你劝使用日志框架(或周围多个日志框架的包装,如Apache共享日志记录),并登录使用该框架的异常(如logger.error("some exception message", e)
这样做,使您可以:
生产质量程序应使用的许多记录的替代品之一(例如log4j的,的logback,java.util.logging中)报告错误和其他诊断。 这有很多的优点:
相反,如果你只是使用的printStackTrace,部署/最终用户,如果任何一点控制和日志信息容易要么被丢失或显示在不适当的情况下,最终用户。 (并没有什么吓坏了胆小的用户不是随机的堆栈跟踪了。)
在简单,e.printStackTrace()是不好的做法,因为它只是打印出堆栈跟踪标准错误。 正因为如此,你不能真正控制这个地方输出变。
几乎每一个日志框架提供了其中我们可以通过Throwable对象与消息一起的方法。 喜欢:
public trace(Marker marker, String msg, Throwable t);
他们打印Throwable对象的堆栈跟踪。
主要的原因是,Proguard的会删除日志从生产要求。 因为记录或打印堆栈跟踪,可以通过例如logcat的阅读器应用程序,看到他们(堆栈跟踪或日志里面的信息)的Android手机里面。 所以这是安全方面有不好的做法。 此外,我们不生产过程中访问它们,这将更好地得到从生产中移除。 由于ProGuard的删除所有记录呼叫没有堆栈跟踪,所以最好使用登录catch块,让他们通过Proguard的退出生产。