2

可能重复:
在 Java 中获取当前堆栈跟踪

我有一种将消息保存到文件的方法。从我的主程序的许多不同部分调用此方法。有什么方法可以按需生成堆栈跟踪,即使Exception尚未触发?

例如,我希望有这样的东西......

void saveMsg(String Msg)
{
  if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ]
  else saveMsgToFile(filePath,Msg);
}

我知道 Java 可以在 中进行堆栈跟踪,但是当没有发生Exception堆栈跟踪时如何生成堆栈跟踪?Exception

4

3 回答 3

2

只需这样做Thread.dumpStack(),这会将堆栈跟踪打印到控制台。没有必要搞乱创建异常并捕获它。

于 2012-11-01T01:51:40.450 回答
2

您可以生成自己的Exception并捕获结果...

try {
    throw new Exception("Tracing only");
}
catch (Exception e){
    e.printStackTrace();
}

将此代码放在要输出堆栈跟踪的任何位置。

这样做的好处是该e.printStackTrace();方法可以很好地为您处理输出,假设您想要输出到控制台。通过触发Exception,您还可以为原因指定一个文本字符串(在本例中为"Tracing only"),因此您可以使用有意义的标题轻松自定义跟踪输出,例如"Tracing the saveMsg method".

或者,您可以通过调用它来获取堆栈跟踪本身...

Thread.currentThread().getStackTrace();

但是,这会给您留下一个StackTraceElement必须循环输出的 s 数组。Exception在我看来,就像第一个选项一样,生成和捕获自己的 更容易、更干净。

于 2012-11-01T01:42:58.117 回答
1

不幸的是,只有

    Thread.currentThread().getStackTrace();

对您的任务有用。问题是前面提到的所有方法都会将您的方法 (saveMsg) 打印在堆栈顶部,但这通常是不可取的。相反,您将不得不跳过从 getStackTrace() 方法返回的第一个元素。

于 2012-11-01T02:05:54.457 回答