在程序中的任何位置生成Java堆栈跟踪

可能重复:
用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时生成堆栈跟踪?


只要执行Thread.dumpStack() ,这会将堆栈跟踪打印到控制台。 无需创建异常并捕获它。


您可以生成自己的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您带来StackTraceElement ,您必须循环输出。 在我看来,它更简单,更清洁,只需生成并捕获自己的Exception ,就像在第一个选项中一样。


不幸的是,只有

    Thread.currentThread().getStackTrace();

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

链接地址: http://www.djcxy.com/p/82407.html

上一篇: Generate a Java stacktrace at any point in the program

下一篇: java: printing current backtrace