首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 異常處理六大反模式與最佳實務

     編輯:Java 相關知識

前言:你能找出這段程式碼的六個問題嗎?

1  OutputStreamWriter out = ...
2  java.sql.Connection conn = ...
3  try {
4    Statement stat = conn.createStatement();
5    ResultSet rs = stat.executeQuery("select uid, name from user");
6    while (rs.next()) {
7      out.println("ID:" + rs.getString("uid") + ",姓名:" + rs.getString("name"));
8    }
9    conn.close();
10   out.close();
11 } catch (Exception ex) {
12   ex.printStackTrace();
13 }

反模式一:吞沒例外

程式碼第 11-13 行。捕獲例外卻僅列印堆疊追蹤,不做任何處理。printStackTrace 僅適合除錯階段,正式環境應採取:修正問題、通知相關人員、轉換為應用層例外、或重新拋出。若無法處理,不要捕獲,讓上層或 JVM 處理。

反模式二:捕獲過於寬泛的例外

第 11 行 catch (Exception ex)。等同捕獲幾乎所有例外,導致 JDBC SQLException 與 I/O IOException 混雜處理。應分別捕獲具體例外類型,必要時使用多 catch 區塊;不預期的例外讓其向上傳播。

反模式三:資源未正確釋放

第 3-10 行。若第 5-8 行拋出例外,conn.close()、out.close() 不會執行,造成資源洩漏。必須使用 finally 區塊確保清理動作執行,並在 finally 內再次 try-catch 避免清理時拋出例外掩蓋原始錯誤。

反模式四:錯誤訊息缺乏上下文

第 3-13 行。例外發生時無法得知正在處理哪筆資料、呼叫哪個方法。應在例外處理加入業務上下文(類別、方法、關鍵參數),並以易讀格式整理堆疊追蹤。

反模式五:try 區塊過大

第 3-10 行。將大量程式碼塞入單一 try,難以定位具體拋出例外的陳述式與類型。應縮小 try 範圍,針對可能拋出例外的特定操作(如資料庫查詢、I/O 寫入)分別包裹。

反模式六:輸出資料不完整

第 6-8 行。迴圈中斷時,已輸出的資料不完整,下游系統收到錯誤資料卻無感知。解法:標記資料不完整(寫入警告標記)、或先緩衝全部資料再一次性輸出。

改寫後的健壯程式碼

OutputStreamWriter out = ...;
java.sql.Connection conn = ...;
try {
  Statement stat = conn.createStatement();
  ResultSet rs = stat.executeQuery("select uid, name from user");
  while (rs.next()) {
    out.println("ID:" + rs.getString("uid") + ",姓名:" + rs.getString("name"));
  }
} catch (SQLException sqlex) {
  out.println("警告:資料不完整");
  throw new ApplicationException("讀取資料時出現 SQL 錯誤", sqlex);
} catch (IOException ioex) {
  throw new ApplicationException("寫入資料時出現 IO 錯誤", ioex);
} finally {
  if (conn != null) {
    try { conn.close(); }
    catch (SQLException sqlex2) {
      System.err.println(this.getClass().getName() + ".mymethod - 無法關閉資料庫連線: " + sqlex2);
    }
  }
  if (out != null) {
    try { out.close(); }
    catch (IOException ioex2) {
      System.err.println(this.getClass().getName() + ".mymethod - 無法關閉輸出檔案: " + ioex2);
    }
  }
}

總結六大原則

  1. 捕獲即處理:不吞沒,採取具體行動或重新拋出
  2. 精確捕獲:指定具體例外類型,多用多 catch
  3. 資源必釋放:善用 finally,清理碼再 try-catch
  4. 豐富上下文:業務資訊 + 結構化錯誤訊息
  5. 縮小 try 範圍:針對單一風險操作包裹
  6. 考慮失敗後果:資料完整性、狀態一致性、下游影響

結語

這些反模式看似瑣碎,卻是生產環境故障的主要溫床。養成嚴謹的異常處理習慣,並在無把握時加上詳細註釋,是專業 Java 開發者的基本修養。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved