2012-05-07 44 views

回答

88

這意味着你應該使用日誌框架像和,而不是直接打印例外:

log.error("Ops!", e); 

日誌框架給你:

e.printStackTrace(); 

你應該使用這個框架API記錄他們很多靈活性,例如您可以選擇是否要登錄到控制檯或文件 - 或者如果在某些環境中發現它們不再相關,可能會跳過一些消息。

31

如果您在例外情況下調用printStackTrace(),則將跟蹤寫入System.err,並且很難將其路由到其他位置(或對其進行過濾)。不要這樣做,建議您使用日誌框架(或多個日誌框架的包裝,如Apache Commons Logging),並使用該框架記錄異常(例如logger.error("some exception message", e))。

這樣做,可以讓你:

  • 寫日誌的語句來一次不同的位置,例如控制檯和文件
  • 根據嚴重性(錯誤,警告,信息,調試等)和來源(通常是基於包或類的)過濾日誌語句
  • 對日誌格式有一些影響,而不必更改代碼
+0

只是在這裏感謝這裏寶貴的反饋;-) – GhostCat

14

生產質量程序應使用的許多記錄的替代品之一(例如log4j的,的logback,java.util.logging中)報告錯誤和其他診斷。這具有許多優點:

  • 日誌消息轉到可配置位置。
  • 除非您配置日誌記錄,否則最終用戶不會看到這些消息。
  • 您可以使用不同的記錄器和記錄級別等來控制記錄多少或多少記錄。
  • 您可以使用不同的appender格式來控制日誌記錄的外觀。
  • 您可以輕鬆地將日誌記錄輸出插入到更大的監視/日誌記錄框架中。
  • 以上所有都可以在不更改代碼的情況下完成;即通過編輯已部署的應用程序的日誌配置文件。

相反,如果你只是使用的printStackTrace,部署/最終用戶,如果任何一點控制和日誌信息容易要麼被丟失或顯示在不適當的情況下,最終用戶。(沒有什麼比一個隨機堆棧跟蹤更害怕一個膽小的用戶。)

1

幾乎每個日誌記錄框架都提供了一個方法,我們可以在該方法中將可丟棄對象與消息一起傳遞。如:

public trace(Marker marker, String msg, Throwable t); 

它們打印可拋出對象的堆棧跟蹤。

3

簡單地說,e.printStackTrace()不是很好的做法,因爲它只是將堆棧跟蹤打印到標準錯誤。正因爲如此,你無法真正控制這個輸出的位置。

相關問題