2009-12-17 96 views
0

我想要設計它,使得無論何時拋出我的自定義異常之一,它都會自動將堆棧跟蹤打印到文件。有沒有一種方法可以覆蓋來實現這一點?這樣做有助於減少我的項目中大量的代碼。拋出時拋出自定義Java異常

回答

3

只要您調用異常的構造函數,stacktrace就可用。你不能對被拋出的事件作出反應,但你可以在你的構造函數中寫入棧跟蹤。 如果你有一個常見的異常類,它是所有自定義異常的基礎,那麼你可以在它的構造函數中完成所有這些。

+1

+1爲細微差別。如果您急於實例化異常並且不總是拋出它們,或者將它們在與引發異常的位置不同的堆棧中實例化,則會導致問題。否則,這應該沒問題。 – 2009-12-17 18:36:09

0

我可以幫助您在拋出異常時打印堆棧跟蹤。但構建異常時很容易 - 只需在您的自定義異常的構造函數中包含printStackTrace()即可。

+0

這不需要管道stderr的文件? – 2009-12-17 18:33:32

+0

不。有一種方法exc.printStackTrace(PrintWriter pw)。你可以通過你喜歡的任何printwriter。 – 2009-12-17 18:40:36

3

你可以有你的自定義異常自RuntimeException繼承,然後設置相關主題的UncaughtExceptionHandler尋找你的異常和你喜歡的處理它們。

+0

正如名稱所述,UncaughtExceptionHandles僅捕獲未被請求的異常。它不能取代放置好的捕捉塊。 – tangens 2009-12-17 18:32:29

1

是否有我可以重寫來實現這個方法?

是的,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()); 
    } 
} 
0

通常,登錄每個異常創建都不是一個好主意。捕手應該真正決定什麼是最好的處理例外。同樣,重寫異常中的方法並記錄到文件中會打破異常的一般合同。

在附註中,您可能會發現與後期登錄相關的一些可怕的性能問題。鑑於壓倒一切發生在一箇中央的地方,你將很難解決這個問題。

如果您仍然希望在拋出異常時進行日誌記錄,那麼更好的解決方案是使用/創建一個像Throwables這樣的實用程序類。將代碼作爲Throwables.logAndThrow(新的CustomerException(...))調用,同一行代碼但長期靈活。 logAndThrow可能是一樣簡單,使用以前的海報的記錄器技術:

公共靜態無效logAndThrow(Throwable的噸){ logger.warning(T); throw t; }