在程序中的任意点生成Java堆栈跟踪
可能重复:在程序中的任意点生成Java堆栈跟踪,java,exception,stack-trace,Java,Exception,Stack Trace,可能重复: 我有一个方法可以将消息保存到文件中。这个方法是从我的主程序的许多不同部分调用的。是否有任何方法可以根据需要生成堆栈跟踪,即使未触发异常 例如,我希望有这样的事情 void saveMsg(String Msg) { if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ] else saveMsgToFile(filePath,Msg); } 我知道Java
我有一个方法可以将消息保存到文件中。这个方法是从我的主程序的许多不同部分调用的。是否有任何方法可以根据需要生成堆栈跟踪,即使未触发
异常
例如,我希望有这样的事情
void saveMsg(String Msg)
{
if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ]
else saveMsgToFile(filePath,Msg);
}
我知道Java可以在
异常中堆叠跟踪
,但是当没有发生异常
时,如何生成堆栈跟踪?您可以生成自己的异常
并捕获结果
try {
throw new Exception("Tracing only");
}
catch (Exception e){
e.printStackTrace();
}
将此代码放在要输出堆栈跟踪的任何位置
这样做的好处是e.printStackTrace()方法为您很好地处理输出,假设您想要输出到控制台。通过触发异常
,您还可以为原因指定文本字符串(在本例中为“仅跟踪”
),因此您可以轻松地使用有意义的标题自定义跟踪输出,例如“跟踪saveMsg方法”
或者,您可以通过调用此
Thread.currentThread().getStackTrace();
但是,这会给您留下一个stackTraceeElement
s数组,您必须循环到输出。在我看来,与第一个选项一样,只生成和捕获自己的异常更容易、更干净。只需执行,这将把堆栈跟踪打印到控制台。没有必要在创建异常和捕获异常时出错。不幸的是,只有
Thread.currentThread().getStackTrace();
对你的任务有用。问题是,前面提到的所有方法都会在堆栈顶部打印您的方法(saveMsg),但这通常是不可取的。相反,您必须跳过从getStackTrace()方法返回的第一个元素。打印stacktrace时不需要抛出异常。只需newexception().printStackTrace()
就可以了。