Java 向堆栈跟踪添加额外信息是否有用?

Java 向堆栈跟踪添加额外信息是否有用?,java,language-agnostic,Java,Language Agnostic,如果能够标记string.valueOf的值将包含在任何堆栈跟踪中的对象,这会很有用。在下面的示例中,我使用了trace。未在堆栈跟踪点声明的变量将被导入。 这将使调试更加容易,并使编写易于调试的程序更加容易 下面代码的堆栈跟踪示例: java.lang.NullPointerException: at Test.main(Test.java:7) index=0, sum=3, obj=null public class Test { Object obj; public

如果能够标记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
    }
  }
}

From:

这可能很有用,但我认为它会使代码变得杂乱无章-大概在代码运行时,您会希望删除“trace”关键字;也许某种形式的元数据更合适


然后总是有打印语句…

这可能很有用,但我认为它会使代码变得混乱-大概在代码运行时,您会希望删除“跟踪”关键字;也许某种形式的元数据更合适


然后总是有打印语句…

是的,它非常有用。我经常自己做这种事情,但我通常只把它编译成非生产代码。

是的,它可能非常有用。我经常自己做这种事情,但我通常只把它编译成非生产代码。

我喜欢的是异常的一个属性,它是一个字符串数组,包含所有方法签名,直到抛出。。。不必从异常文本中解析它。

我喜欢的是异常的一个属性,它是一个字符串数组,包含所有方法签名,直到抛出。。。不必从异常文本中解析它。

Visual Studio C调试器的调用堆栈窗口包括一个堆栈跟踪,其中显示了所有参数值。

Visual Studio C调试器的调用堆栈窗口包括一个堆栈跟踪,其中显示了所有参数值。

。就我个人而言,我认为这没什么用。如果我正在运行代码并遇到异常,我可以更轻松地设置断点并进入代码,查看此时所有的变量是什么,并找出真正的中断点


使用这种跟踪方法,我不仅需要在处理不同的bug时不断地在变量前面添加和删除关键字,而且我不认为这会比添加良好的日志记录/调试消息有任何真正的改进,在推送到生产环境时,删除或禁用这些消息要容易得多。

Eh。就我个人而言,我认为这没什么用。如果我正在运行代码并遇到异常,我可以更轻松地设置断点并进入代码,查看此时所有的变量是什么,并找出真正的中断点


使用这种跟踪方法,我不仅需要在处理不同的bug时不断地在变量前面添加和删除关键字,而且我不认为这会比添加良好的日志记录/调试消息有任何真正的改进,在推送到生产环境时,删除或禁用这些消息要容易得多。

,但是我认为这个特性不能保证Java中有一个新的关键字,也不能保证Java语言的复杂性


我发现Throwable.printStackTrace的使用通常足以迅速指出需要我注意的问题。

很诱人,但我认为这一特性不能保证在Java中有一个新的关键字,也不能保证语言的复杂性


我发现Throwable.printStackTrace的使用通常足以快速指出需要我注意的问题。

也许我没有抓住要点,但为什么不使用适当的日志框架,例如Log4j呢?然后,您可以使用嵌套/映射的诊断上下文/输出变量值。

也许我没有抓住要点,但为什么不使用适当的日志框架,例如Log4j?然后,您可以使用嵌套/映射的诊断上下文/输出变量值。

我更喜欢使用基于标准注释的方式来描述程序员对空值的意图FindBugs,JSR 305。我曾经考虑过,在异常消息中不仅要包含行号,还要包含列号,这样在长链调用中,您就可以更容易地看到是哪个点运算符导致了NPE。正如其他人在StackOverflow的NPE相关问题中所述,在大多数情况下,您通过尝试访问空对象上的字段/方法获得NPE。

我更喜欢使用基于标准注释的方式来描述程序员对空值FindBugs的意图,JSR 305。我曾经考虑过,在异常消息中不仅要包含行号,还要包含列号,这样在长链调用中,您就可以更容易地看到是哪个点运算符导致了NPE。正如其他人在StackOverflow的NPE相关问题中所述,在大多数情况下,您通过尝试访问空对象上的字段/方法获得NPE。

这是如何标记java和语言不可知的?这是如何标记java和语言不可知的?您可以在异常情况下调用getStackTrace以获得
所有堆栈帧的StackTraceElement数组和toString。您可以在异常情况下调用getStackTrace以获取所有堆栈帧的StackTraceElement数组和toString。如何在禁用调试的prod中运行,但在出现错误时获取调试消息?如何在禁用调试的prod中运行,但获取调试消息当出现错误时?NPE只是一个例子。这个想法和所有的一次性用品有关。我不知道。如果以编程方式引发异常,请在消息中包含相关的对象值,或创建一个自定义异常类来保存它们:抛出新的IllegalArgumentExceptionobj is+obj+而不是X;相关的信息可能在堆栈中更高,所以这不起作用。NPE只是一个例子。这个想法和所有的一次性用品有关。我不知道。如果以编程方式引发异常,请在消息中包含相关的对象值,或创建一个自定义异常类来保存它们:抛出新的IllegalArgumentExceptionobj is+obj+而不是X;相关信息可能在堆栈中更高,因此不起作用。然后,您的代码必须捕获并记录每个异常以获取该数据。然后,您的代码必须捕获并记录每个异常以获取该数据。