我想要設計它,使得無論何時拋出我的自定義異常之一,它都會自動將堆棧跟蹤打印到文件。有沒有一種方法可以覆蓋來實現這一點?這樣做有助於減少我的項目中大量的代碼。拋出時拋出自定義Java異常
回答
只要您調用異常的構造函數,stacktrace就可用。你不能對被拋出的事件作出反應,但你可以在你的構造函數中寫入棧跟蹤。 如果你有一個常見的異常類,它是所有自定義異常的基礎,那麼你可以在它的構造函數中完成所有這些。
我可以幫助您在拋出異常時打印堆棧跟蹤。但構建異常時很容易 - 只需在您的自定義異常的構造函數中包含printStackTrace()
即可。
這不需要管道stderr的文件? – 2009-12-17 18:33:32
不。有一種方法exc.printStackTrace(PrintWriter pw)。你可以通過你喜歡的任何printwriter。 – 2009-12-17 18:40:36
你可以有你的自定義異常自RuntimeException繼承,然後設置相關主題的UncaughtExceptionHandler尋找你的異常和你喜歡的處理它們。
正如名稱所述,UncaughtExceptionHandles僅捕獲未被請求的異常。它不能取代放置好的捕捉塊。 – tangens 2009-12-17 18:32:29
是否有我可以重寫來實現這個方法?
是的,printStacktrace()
方法。
您可以爲您的例外創建一個基類,並調用一個將被重定向到您的文件的「內部」打印。
您可以使用Logger
,並有具體的記錄器指向你想要的文件(並改變它,禁用它,重新啓用它,等當你需要)沿線
東西:
class MyStackTrace extends Throwable {
public void printStacktrace() {
super.printStracTrace();
internalPrint();
}
private void internalPrint() {
StringWriter sw = new StringWriter();
printStackTrace(sw);
Logger logger = Logger.getLogger("exceptions");
logger.warning(sw.toString());
}
}
通常,登錄每個異常創建都不是一個好主意。捕手應該真正決定什麼是最好的處理例外。同樣,重寫異常中的方法並記錄到文件中會打破異常的一般合同。
在附註中,您可能會發現與後期登錄相關的一些可怕的性能問題。鑑於壓倒一切發生在一箇中央的地方,你將很難解決這個問題。
如果您仍然希望在拋出異常時進行日誌記錄,那麼更好的解決方案是使用/創建一個像Throwables這樣的實用程序類。將代碼作爲Throwables.logAndThrow(新的CustomerException(...))調用,同一行代碼但長期靈活。 logAndThrow可能是一樣簡單,使用以前的海報的記錄器技術:
公共靜態無效logAndThrow(Throwable的噸){ logger.warning(T); throw t; }
- 1. 拋出自定義異常
- 2. 拋出自定義異常
- 3. 在Java中拋出自定義異常與在異常中拋出異常
- 4. 拋出自定義Java異常
- 5. Java:拋出自身異常(?)
- 6. Java:拋出異常
- 7. 自定義鍵盤拋出異常
- 8. Kotlin - 拋出自定義異常
- 9. .NET拋出自定義異常
- 10. 拋出和捕獲自定義異常
- 11. 從SSRS拋出自定義異常
- 12. 在Servlet中拋出自定義異常
- 13. 拋出異常不拋出
- 14. 魔術異常拋出拋出異常
- 15. 拋出異常拋出異常
- 16. 在Java中拋出異常的方法拋出異常
- 17. Java:可以拋出異常拋出異常嗎?
- 18. 從列表中拋出拋出異常時拋出IndexOutOfBoundsException:Java-> Kotlin
- 19. 拋出異常
- 20. 異常拋出
- 21. 拋出異常
- 22. 拋出異常
- 23. 拋出異常
- 24. 拋出異常
- 25. 拋出異常
- 26. 拋出異常
- 27. Java類拋出異常
- 28. Java - 拋出IOException異常
- 29. Java拋出與SortedSet異常
- 30. 未拋出的異常Java
+1爲細微差別。如果您急於實例化異常並且不總是拋出它們,或者將它們在與引發異常的位置不同的堆棧中實例化,則會導致問題。否則,這應該沒問題。 – 2009-12-17 18:36:09