首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

S2SH架構異常處理最佳實踐:統一異常攔截與錯誤頁面導向

     編輯:程式設計綜合問答

痛點分析

在Struts2 + Spring + Hibernate (S2SH) 分層架構中,異常處理常見混亂:

  • DAO層拋SQLException,Service層捕獲轉為業務異常,Action層再捕獲...
  • 每層都try-catch導致代碼膨脹,錯誤信息丟失
  • 前端頁面顯示堆棧跟蹤,用戶體驗差、安全隱患

推薦分層異常策略

核心實現: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代碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級職責異常處理方式
DAO/持久層數據訪問不捕獲,拋出運行時異常(如`DataAccessException`)或包裝為自定義`DaoException`
Service/業務層事務控制、業務邏輯捕獲DAO異常,轉為業務異常(如`BusinessException`),攜帶友好錯誤碼/消息;聲明式事務回滾
Action/控制層請求分發、視圖跳轉不捕獲具體異常,拋給全局攔截器
展示層用戶交互友好錯誤頁面、AJAX返回JSON錯誤碼