我有一个将消息保存到文件的方法。从我的主程序的许多不同部分调用此方法。是否有任何方法可以按需生成堆栈跟踪,即使尚未触发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
,我怎样才能生成堆栈跟踪?
答案 0 :(得分:2)
您可以生成自己的Exception
并捕获结果...
try {
throw new Exception("Tracing only");
}
catch (Exception e){
e.printStackTrace();
}
将此代码放在您想要输出堆栈跟踪的任何位置。
这样做的好处是e.printStackTrace();
方法可以很好地为您处理输出,假设您想要输出到控制台。通过触发Exception
,您还可以为原因指定文本字符串(在此示例中为"Tracing only"
),因此您可以使用有意义的标头轻松自定义跟踪输出,例如{{1} }。
或者你可以通过调用它来获取堆栈跟踪...
"Tracing the saveMsg method"
然而,这会留下一个Thread.currentThread().getStackTrace();
的数组,你必须循环到输出。在我看来,像第一个选项一样,生成和捕获自己的StackTraceElement
更容易,更清晰。
答案 1 :(得分:2)
只需执行Thread.dumpStack()
,这会将堆栈跟踪打印到控制台。没有必要混淆创建异常并捕获它。
答案 2 :(得分:1)
不幸的是,只有
Thread.currentThread().getStackTrace();
对您的任务有用。问题是所有前面提到的方法都会在堆栈顶部打印你的方法(saveMsg),但这通常是不可取的。相反,您将不得不跳过从getStackTrace()方法返回的第一个元素。