[英]Best practices for catching Throwable in Java
有時,您只需要捕獲Throwable,例如在編寫調度隊列時調度通用項並需要從任何錯誤中恢復(所述調度程序記錄所有捕獲的異常,但是靜默地,然后繼續執行其他項)。
我能想到的一個最佳實踐是,如果它是InterruptedException,則總是重新拋出異常,因為這意味着有人打斷了我的線程並想要殺死它。
另一個建議(來自評論,而不是答案)是始終重新拋出ThreadDeath
還有其他最佳做法嗎?
可能最重要的是, 永遠不要吞下一個經過檢查的例外 。 我的意思是不要這樣做:
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 */ }
}
取決於你在做什么。
如果您正在開發一個供其他人使用的API,最好重新拋出Exception或將其包裝到您的自定義異常中並拋出。
而如果您正在開發一個最終用戶應用程序,則需要處理此異常並完成所需的操作。
那么OutOfMemoryError(或者它的超類VirtualMachineError)呢? 我無法想象在一些嚴肅的事情之后你能做多少事情。
如果您正在編寫調度程序隊列,那么當異常返回給您時,除了記錄它之外,沒有必要對其執行任何操作。 Swing事件隊列基本上具有該類型的行為。
或者,您可以為“未捕獲的異常處理程序”提供一個鈎子,類似於ThreadGroup 。 請注意,處理程序可能需要很長時間,最終會延遲調度程序。
就InterruptedException而言:唯一關心的是你的調度循環,它應該檢查一些外部狀態,看它是否應該停止處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.