簡體   English   中英

在Java中捕獲Throwable的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM