在堆栈跟踪中添加额外的信息是否有用?
能够标记任何堆栈跟踪中将包含String.valueOf()值的对象是否有用。在下面的示例中,我使用了" trace"。未在堆栈跟踪点声明的变量将被插入。
这将使调试变得更加容易,并使编写易于调试的程序变得更加容易。
以下代码的示例堆栈跟踪:
java.lang.NullPointerException: at Test.main(Test.java:7) index=0, sum=3, obj=null public class Test { Object obj; public void main(String[] args) trace obj { trace int sum = 0; for(trace int index = 0; index < args.length; index++) { sum += Integer.parseInt(args[index]); sum += obj.hashCode();//Will cause NullPointerException } } }
来自:http://jamesjava.blogspot.com/2005/04/extra-info-in-stack-traces.html
解决方案
这可能很有用,但我认为这可能会使代码混乱,而在代码工作时,我们可能希望删除" trace"关键字;也许某种形式的元数据会更合适
那么总会有打印语句...
是的,它可能非常有用。我经常自己做这种事情,但是通常我只能将其编译成非生产代码。
我想要的是异常的属性,该异常将是导致抛出异常的所有方法签名的字符串数组...而无需从Exception文本中解析出来。
Visual Studio Cdebugger的调用堆栈窗口包括一个堆栈跟踪,其中显示了所有参数值。
嗯我个人认为这没有用。如果我正在运行我的代码并遇到异常,我可以更轻松地设置一个断点并进入代码,查看该点所有变量的含义,并弄清它真正在哪里中断。
使用这种跟踪方法,不仅在我处理不同的bug时,我必须不断在变量前面添加和删除关键字,而且我认为这与仅添加良好的日志记录/调试消息传递(在推向生产环境时更容易删除或者禁用)。
诱人,但我不认为此功能需要Java中的新关键字(并且该语言的复杂性更高)。
我发现使用Throwable.printStackTrace通常足以快速指出需要我注意的问题。
也许我没有抓住重点,但是为什么不使用适当的日志记录框架(例如Log4j)呢?然后,我们可以使用嵌套/映射的诊断上下文(NDC / MDC)输出变量值。
我宁愿使用一种标准(基于注释)的方式来描述程序员对空的意图(FindBugs,JSR 305)。我曾经考虑过不仅在异常消息中包括行号,还包括列号,因此在长链调用中,我们可以更容易地了解哪个点运算符导致了NPE。正如其他人在StackOverflow上有关NPE的相关问题中所述,大多数情况下,通过尝试访问空对象上的字段/方法可以获得NPE。