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

異常處理最佳實踐:杜絕重複日誌、友好回饋用戶

     編輯:Java 相關知識

N 層架構下,同一異常被 Servlet、Facade、Client 三層各自 printStackTrace,日誌淹沒在重複堆疊中。本文確立「自定義異常拋出前打印一次,上層僅轉換不再捕獲」原則,並設計 errorCode 機制實現用戶友好錯誤提示,附完整代碼示例。

反模式:層層捕獲打印

// Servlet
catch (MyAppEx e) { e.printStackTrace(); }

// Facade
catch (DaoEx e) { e.printStackTrace(); throw new MyAppEx(); }

// Client
catch (SoapFault e) { e.printStackTrace(); throw new MyAppEx(); }
// 結果:同一錯誤在日誌出現 3 次完整堆疊

正規軍規:單點打印 + 錯誤碼轉換

  1. 源頭打印:在最底層(如 WebServiceClient.login)捕獲原始異常,打印堆疊並附加業務語義日誌,包裝拋出自定義異常
  2. 中間透傳:Facade、Servlet 不再 catch-print,直接拋出或加上下文後拋出
  3. 表現層轉換:Servlet 根據 errorCode 映射用戶友好訊息
// 自定義異常攜帶錯誤碼
public class MyAppException extends Exception {
    private final int errorCode;
    public MyAppException(int code, Exception cause, Object... args) { super(cause); this.errorCode = code; }
    public int getErrorCode() { return errorCode; }
}

// Servlet 統一轉換
catch (MyAppException e) {
    String msg = switch (e.getErrorCode()) {
        case WS_CONNECT_FAIL -> "無法連線外部系統,請聯繫管理員";
        case DUPLICATE_EXPORT -> "重複匯出數據";
        default -> "系統暫時不可用,請稍後再試";
    };
    renderError(msg);
}

核心原則

  • 異常堆疊只打印一次,位於「邊界轉換點」
  • 業務異常攜帶語義碼,而非裸露技術細節
  • 用戶看語義,開發看日誌,兩套話術嚴格分離
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved