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

J2EE 異常處理框架設計:消除樣板碼、集中管理、上下文敏感

     編輯:Java 相關知識

核心原則:Checked vs Unchecked

  • Unchecked (RuntimeException):使用者無法處理、致命不可復原(如 XML 解析失敗、資料庫連線斷)。
  • Checked:業務邏輯相關、使用者可採取行動(如驗證失敗、權限不足、需確認動作)。

異常拋出策略:單一 BaseAppException

所有可拋出 checked 例外的方法,throws 僅宣告 BaseAppException。具體例外以多型隱藏:

public void updateUser(UserDTO dto) throws BaseAppException {
    if (!regionActive) throw new RegionNotActiveException("Region inactive");
}

Controller 單一 catch (BaseAppException) 統一處理,避免大量 catch 區塊與方法簽名連鎖變更。

特例:需針對特定例外處理業務邏輯

極少數情況下方法可額外拋出具體例外(如 CustomerNotActiveException),呼叫端捕捉後執行替代流程(如啟用客戶)。

第三方例外包裝

統一包裝為應用專屬 unchecked 例外(繼承 RuntimeException),保留原始原因:

try { BeanUtils.copyProperties(dto, form); }
catch (Exception e) { throw new CopyPropertiesException("Copy failed", e); }

合併同義例外:上下文敏感錯誤碼

OrderNotFoundException、CustomerNotFoundException 本質相同 → 合併為 RecordNotFoundException。透過「上下文」產生唯一錯誤碼:

eh.handleException("employee.addEmployee", userId, ex);
// 錯誤碼 = messagecode.recordnotfound.employee.addEmployee

配置檔 exceptioninfo.xml 定義:messagecode、confirmationind、contextind、loggingtype。

表示層處理:Template Method 模式消除樣板碼

基類 BaseAppDispatchAction 實作 execute() 模板:

try {
    dispatchMethod(...); // 委派給子類別具體 Action
} catch (BaseAppException ex) {
    // 統一:取得錯誤碼、記錄、存入 ActionErrors、轉向指定頁面
    // 所需上下文 (actionForward, context) 存於 ThreadLocal
}

子類別 Action 僅需設定 ThreadLocal 後專注業務邏輯。

ExceptionHandler 外觀模式

ExceptionHandler 封裝:解析例外類別名稱 → 查詢 ExceptionInfoCache (快取 XML 配置) → 產生 ExceptionDTO (含錯誤碼、是否確認) → 依 loggingtype 記錄 → Factory 提供多種實作。

Web 層 Unchecked 例外處理

web.xml 配置 error-page 對應例外類別/HTTP 狀態碼,顯示友善錯誤頁面。

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