核心誤區澄清
「catch 為空編譯通過,運行出錯不知道 → 不如不寫 try-catch」
**錯誤**。`try-catch` 的核心價值是 **異常捕獲後程序繼續運行**,而非掩蓋錯誤。空 `catch` 是**濫用**,而非機制缺陷。
異常處理三層意義
- 流程控制:將錯誤處理邏輯從主流程分離,避免 `if (err) return` 滿屏。
- 資源安全:`finally` / `try-with-resources` 保證鎖、連接、流關閉,防洩漏。
- 語義豐富:異常類型傳遞錯誤語義 (`SQLException` vs `IOException`),調用者可針對性處理。< /li>
正確的 catch 內容模板
try {
// 核心業務
} catch (SQLException e) {
// 1. 記錄完整堆棧 (生產環境必須)
log.error("DB error", e);
// 2. 業務補償: 回滾事務、釋放鎖、重試、降級
transaction.rollback();
// 3. 向上拋出或轉換為業務異常
throw new BusinessException("數據庫繁忙", e);
} catch (Exception e) {
log.error("Unexpected", e);
throw new RuntimeException(e); // 保留堆棧
}
空 catch 的危害與檢測
- 吞沒異常 → 難以定位 Bug、數據不一致、安全漏洞。
- 靜態分析工具 (SonarQube, SpotBugs, Alibaba Java Coding Guidelines) 會報警:`Empty catch block`。< /li>
受檢異常 vs 非受檢異常選擇
- 可恢復/預期內錯誤 (IO、DB、網絡) → **受檢異常** (`throws` / `try-catch`),強制調用者處理。
- 編程錯誤/不可恢復 (空指針、越界、非法參數) → **非受檢異常** (`RuntimeException` 子類),快速失敗。< /li>