2009-07-08 34 views
12

有時,您只需捕獲Throwable,例如,當編寫調度器隊列調度通用項目並需要從任何錯誤中恢復時(所述調度器記錄所有捕獲到的異常,但是默默地執行,然後在其他項目上繼續執行)。在Java中捕獲Throwable的最佳實踐

我能想到的是要始終重新拋出異常,如果它是InterruptedException的,因爲這意味着有人打斷了我的線程,並想要殺死它的一個最佳實踐。

另一項建議(即從一個評論,而不是答案出來)是始終重新拋出ThreadDeath

任何其他最佳做法?

+2

`ThreadDeath`也應該被重新拋出,但不應該拋在第一位。 – 2009-07-08 11:54:40

+0

爲什麼發表評論,這只是我想要的答案類型? – ripper234 2009-07-08 13:40:49

回答

12

也許最重要的是,從來沒有吞下一個檢查異常。我的意思是不這樣做:

try { 
    ... 
} catch (IOException e) { 
} 

除非這就是你想要。有時候人們會吞下檢查的異常,因爲他們不知道如何處理它們,或者不想(或不能)用「拋出異常」子句來污染它們的接口。

如果你不知道該怎麼用它做什麼,做到這一點:

try { 
    ... 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 

另外一個彈簧想到是確保你處理例外。讀取一個文件應該是這樣的:

FileInputStream in = null; 
try { 
    in = new FileInputStream(new File("..."));; 
    // do stuff 
} catch (IOException e) { 
    // deal with it appropriately 
} finally { 
    if (in != null) try { in.close(); } catch (IOException e) { /* swallow this one */ } 
} 
+2

+1永遠不會吞下檢查的異常 - 即使是在你的第一關。這些事情往往被忽略,最終被提交到源代碼控制。如果有疑問,至少要打印堆棧跟蹤。 – akf 2009-07-08 11:53:18

+0

如果你不能處理它並且不能重新拋出它,至少要打印堆棧跟蹤!日誌中的堆棧跟蹤對診斷問題很有幫助。 – starblue 2009-07-08 11:53:36

2

取決於你在做什麼。

,如果你正在開發一個API,由另外一個人,它能夠更好地重新拋出異常或者包裝到你的自定義異常,並拋出使用。

鑑於如果您正在開發一個最終用戶應用程序,您需要處理此異常並執行必要的操作。

1

如果你正在寫一個調度隊列,然後由當時的例外還是回到你身邊有一個在做任何事的不是記錄它的其他沒有任何意義。 Swing事件隊列基本上具有這種類型的行爲。

或者,您可以爲「未捕獲的異常處理程序,」類似ThreadGroup提供了一個鉤。請注意,處理程序可能需要很長時間,並最終延誤調度程序。

至於InterruptedException的雲:那在乎的只是您的調度循環,這應該檢查一些外部的狀態,看它是否應該停止處理。

2

OutOfMemoryError(或者它的超類VirtualMachineError)呢?我無法想象在嚴肅的事情之後你能做些什麼。