當我們說e.printStackTrace();
時會發生什麼?這裏e
是任何Exception
。它是否會停止正常執行並實際從線程堆棧中移除激活記錄以給出異常的堆棧跟蹤?在應用程序中使用它是一個好主意嗎?異常和堆棧跟蹤
異常和堆棧跟蹤
回答
它停止正常執行
號
,實際上從線程堆棧中刪除的活動記錄給異常的堆棧跟蹤?
No.
該信息已被捕獲已被捕獲。這發生在Throwable
的構造函數中;即當你new
出現異常,而不是你throw
的時候。 Throwable
構造函數調用fillInStackTrace()
本地方法,該方法獲取堆棧的快照,並將生成的StackTraceElement[]
存儲在稍後打印堆棧跟蹤時使用的專用變量中。
(根據記錄,這是的Javadoc的Throwable
構造函數指定。
這是個好主意,在應用程序中使用它?
那麼它是相當昂貴的,可以產生大量的輸出但是如果你需要需要用於診斷目的的堆棧跟蹤......做到這一點
標準錯誤,不是標準輸出。儘管在大多數情況下它並不重要 – AlexR 2011-02-10 13:04:31
@AlexR是同意 – 2011-02-10 13:04:54
它只是打印堆棧軌跡這已經由異常對象持有到STDERR。無副作用。
一個小副作用是堆棧跟蹤在出於性能原因使用之前未被填充,通常不使用堆棧跟蹤。它存儲在其他地方,但在代碼中使用之前,您無法在調試器中看到它。 – 2011-02-10 14:31:19
@Peter Lawrey在「本地某處」的其他地方,但「本地某處」通常填充了「fillInStackTrace」,它已經具有記錄堆棧的「成本」。這只是將其從原生地方拖到被繞過的StackTraceElement對象的「成本」。 – 2011-02-10 14:49:36
沒有什麼特別聰明的事情發生。 Exception
對象包含一個StackTraceElements的列表,並且在調用上述內容時它將它們簡單地轉儲到stderr。
如前所述,沒有副作用,在生產代碼中不會引入任何問題。然而,我並不真正告訴它(在生產代碼中),只是因爲在大多數應用程序中使用記錄器來更好地控制記錄的內容以及記錄的位置會更好。
堆棧跟蹤通過fillInStackTrace
加載,這是在Throwable的構造函數中調用的本地方法。 (整潔的提示:這種方法可以作爲「信號異常」的NOP來重載,而不需要相當昂貴的調用來獲得堆棧)。
堆棧跟蹤的「凍結」對於 Throwable對象在「被捕獲」時已經存在。
根據java.lang.Throwable的代碼顯示fillInStackTrace
被稱爲構造函數的第一個動作。 StackTraceElement
的數組用於序列化支持(這也可以手動設置)並作爲惰性緩存。
即使是fillInStackTrace
捕獲跟蹤它不加載到Java對象 - 我想這允許執行,以保持它「便宜」 - 直到它需要爲StackTraceElement
對象的順序被訪問(例如對於在Java代碼中完成的printStackTrace
)。 Throwable的代碼比我能解釋得更好:-)
快樂編碼。
- 1. 異常堆棧跟蹤
- 2. Sammy.js異常堆棧跟蹤
- 3. Java異常處理和堆棧跟蹤
- 4. Resque:異常和堆棧跟蹤
- 5. 沒有堆棧跟蹤異常
- 6. ASM ByteCode - 異常的堆棧跟蹤
- 7. 檢索異常全堆棧跟蹤
- 8. 打印堆棧跟蹤元素異常
- 9. 異常堆棧跟蹤丟失項目
- 10. 打印異常的堆棧跟蹤
- 11. Java異常堆棧跟蹤不打印
- 12. JDBC Appender不寫異常堆棧跟蹤
- 13. PostSharp異常堆棧跟蹤未完成
- 14. 異常(堆棧跟蹤)在一行
- 15. 異常的空堆棧跟蹤
- 16. Javascript異常棧跟蹤
- 17. 獲取IIS 7.5和C#的堆棧跟蹤每個異常
- 18. 得到完整的異常類型/消息和堆棧跟蹤
- 19. 堆棧跟蹤3
- 20. C# - 創建新的異常而不丟失堆棧跟蹤和內部異常?
- 21. nlog異常佈局來格式化異常類型,消息和堆棧跟蹤
- 22. 堆棧跟蹤如何構建以及堆棧如何跟蹤?
- 23. 從javascript堆棧跟蹤中查找Java實際堆棧跟蹤
- 24. ScheduledExecutorService的任務拋出異常時不打印堆棧跟蹤
- 25. java - 自動打印堆棧跟蹤未捕獲的異常
- 26. Application Insight中的MVC異常隱藏堆棧跟蹤
- 27. 如何重新拋出異常並保留堆棧跟蹤?
- 28. 如何在C#中格式化異常的堆棧跟蹤?
- 29. Eurekalog:保存異常堆棧跟蹤到日誌文件
- 30. WebSphere日誌中沒有出現異常堆棧跟蹤
堆棧跟蹤是創建異常時的線程堆棧,而不是它打印的地方/記錄。 – 2011-02-10 14:30:04