| 層級 | 職責 | 異常處理方式 |
| DAO/持久層 | 數據訪問 | 不捕獲,拋出運行時異常(如`DataAccessException`)或包裝為自定義`DaoException` |
| Service/業務層 | 事務控制、業務邏輯 | 捕獲DAO異常,轉為業務異常(如`BusinessException`),攜帶友好錯誤碼/消息;聲明式事務回滾 |
| Action/控制層 | 請求分發、視圖跳轉 | 不捕獲具體異常,拋給全局攔截器 |
| 展示層 | 用戶交互 | 友好錯誤頁面、AJAX返回JSON錯誤碼 |
核心實現:Struts2 全局異常攔截器
<!-- struts.xml -->
<package name="default" extends="struts-default">
<global-results>
<result name="error">/WEB-INF/views/error.jsp</result>
<result name="ajaxError" type="json">
<param name="root">errorResult</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="com.app.exception.BusinessException" result="error" />
<exception-mapping exception="java.lang.Exception" result="error" />
</global-exception-mappings>
</package>
自定義異常體系示例
// 基礎業務異常
public class BusinessException extends RuntimeException {
private String errorCode; // 如 "USER_NOT_FOUND"
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
// getter...
}
// 具體業務異常
public class InsufficientBalanceException extends BusinessException {
public InsufficientBalanceException(String msg) {
super("INSUFFICIENT_BALANCE", msg);
}
}
優勢總結
- 代碼乾淨:業務代碼無try-catch雜訊
- 統一風格:所有錯誤統一入口,便於日誌、監控、國際化
- 安全可控:前端不暴露堆棧,只顯示友好提示
- 擴展性強:新增異常類型只需在xml映射,無需改動Java代碼
- 上一篇文章: 請求HTML頁面是否自動建立Session?Web會話追蹤機制詳解
- 下一篇文章: Android螢幕自動旋轉開關變更監聽:使用ContentObserver而非廣播
Copyright ©
程式碼之家 All Rights Reserved