所有可拋出 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。
基類 BaseAppDispatchAction 實作 execute() 模板:
try {
dispatchMethod(...); // 委派給子類別具體 Action
} catch (BaseAppException ex) {
// 統一:取得錯誤碼、記錄、存入 ActionErrors、轉向指定頁面
// 所需上下文 (actionForward, context) 存於 ThreadLocal
}
子類別 Action 僅需設定 ThreadLocal 後專注業務邏輯。
ExceptionHandler 封裝:解析例外類別名稱 → 查詢 ExceptionInfoCache (快取 XML 配置) → 產生 ExceptionDTO (含錯誤碼、是否確認) → 依 loggingtype 記錄 → Factory 提供多種實作。
web.xml 配置 error-page 對應例外類別/HTTP 狀態碼,顯示友善錯誤頁面。