2012-11-01 14 views
2

可能重複:
Get current stack trace in 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發生?

回答

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秒的陣列。在我看來,它更容易,更清潔,只需生成並捕獲自己的Exception,就像第一個選項一樣。

+5

您不需要拋出異常來打印堆棧跟蹤。只需'新的異常()。printStackTrace()'工作。 –

2

只要做Thread.dumpStack(),這將打印堆棧跟蹤到控制檯。無需創建異常並捕獲它。

1

遺憾的是,只有

Thread.currentThread().getStackTrace(); 

您的任務是有用的。問題是前面提到的所有方法都會將你的方法(saveMsg)打印在堆棧的頂部,但這通常是不可取的。相反,您將不得不跳過getStackTrace()方法返回的第一個元素。