我刚刚进入新的代码库。在努力使应用程序在本地运行时,我注意到我只是在日志和控制台输出中出现错误的单行 - 没有堆栈跟踪。我开始搜索代码,我唯一能找到的是异常消息。同意“链接”例外:仅保留消息。我向项目的唯一开发人员提到了这一点,并询问这是否是一个有意的设计决定。答复部分是“我认为我们不会从[记录堆栈跟踪]中获得太多收益。”
从Java开发的多年开始,我知道堆栈跟踪的价值有多大:它们告诉您发生异常的哪一行,您可以跟踪到达目的地的方式。您阅读了堆栈跟踪和相关代码,这可能足以解决您遇到的80%(N.B:统计数据没有统计支持)。
我不是在寻找关于记录什么或何时记录的论点 - 这不是问题,而是在其他地方已经涵盖了。真的,这对我来说似乎是一件非常重要的事情,除了那个“strack trace显示错误在哪里”之外,我从未想过如何解释它。我希望我能快速找到 Effective Java 之类的引用,但到目前为止谷歌还没有发现任何内容。
有关权威,有说服力的消息来源的任何建议,说明为什么要注意堆栈痕迹?
答案 0 :(得分:8)
在代码库中创建故意错误并让他跟踪它:-)。说真的,你有很好的论据,如果你可以证明它有多大帮助,以及在追踪错误时节省了多少时间。
答案 1 :(得分:3)
对于Java来说,Google's coding standard可能会被认为足够权威:
异常所有方法都必须声明 他们的非运行时异常 可能会抛出他们的投掷条款。如果 他们可能会扔几个,一定是 列出,虽然缩短列表 列出基类而不是全部 他们鼓励他们的孩子 信息不会丢失。在 特别是'抛出异常'应该 永远不会出现在任何方法上,除了 极端情况,例如方法 它们是如此通用以至于它们实际上可能 抛出任何异常。
同样,'catch(例外e)' 不应该在任何地方使用,因为它 可以捕获不应该的异常 被抓住,从而隐藏问题。该 正在捕获的确切异常 应该拼写出来。
出于类似的原因,空捕获 应避开街区(除了 测试代码的例外情况 预期),因为他们也可能隐藏 问题并使调试变得困难。 如果你知道异常可以 从来没有发生总是提高 带有消息的OntopiaRuntimeException 喜欢'“(不可能)”+ e',并通过 在捕获的异常中保存 堆栈跟踪。
答案 2 :(得分:0)
我发现正好在这个项目上使用的Apache Commons Logging有这些guidelines for logging exceptions指定“使用完整堆栈跟踪记录。”
我仍然希望找到一些非常坦率的说明这应该是默认行为,除非你有一个非常非常好的理由去做。详细了解为什么这是一个好主意会更好。