| 功能維度 | 關鍵字/機制 | 典型場景 | 代碼示例 |
|---|---|---|---|
| 異常捕獲與轉換 | catch、throw | 底層異常包裝為業務異常 | catch (SQLException e) { throw new BizException("DB_ERROR", e); } |
| 異常恢復與重試 | catch 內重試邏輯 | 網絡抖動自動重試 3 次 | for(int i=0;i<3;i++) try{return doRequest();}catch(e){sleep(1000);} |
| 資源確釋釋放 | finally、try-with-resources | 關閉流、釋放鎖、歸還連接池 | try (Connection c = pool.get()) { ... } |
| 流程控制導向 | catch 後續邏輯 | 輸入驗證失敗提示重輸 | catch(NumberFormatException e) { promptReinput(); } |
| 異常日誌與監控 | catch 中記錄 | 上報 Sentry、寫入 ELK | catch (Exception e) { log.error("Order failed", e); metrics.incr(); } |
// 自動關閉實現 AutoCloseable 的資源,無需 finally
try (FileInputStream fis = new FileInputStream("data.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
return br.lines().collect(Collectors.joining("\n"));
} // 編譯器自動生成 finally 關閉代碼,即使發生異常也能正確關閉
// Java 7+ 單塊處理多種異常
try {
parseConfig();
} catch (IOException | ParseException | NullPointerException e) {
log.warn("Config load failed, using defaults", e);
loadDefaults();
}
// 僅處理特定子類,其他向上拋出
try {
riskyOperation();
} catch (CustomException e) when (e.getCode() == 404) { // C# 語法,Java 需在 catch 內判斷
handleNotFound();
}
// ❌ 反模式:空 catch 隱藏 Bug
try { save(); } catch (Exception e) {}
// ✅ 正確:至少記錄日誌
try { save(); } catch (Exception e) {
log.error("Save failed silently", e); // 保留堆棧追蹤
throw new RuntimeException(e); // 或重新拋出
}
@ControllerAdvice 集中處理,避免 Controller 充斥 try-catchOptional、Result 模式表達預期失敗,保留異常給真正意外情況try-catch 不只是「捕獲並打印」,而是構建 健壯性邊界 的核心工具:捕獲 → 判斷 → 恢復/轉換/記錄 → 釋放資源 → 繼續/終止。善用 finally 與 try-with-resources 守護資源,用異常類型體系表達業務語義,才是成熟 Java 開發者的標誌。