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

ASP.NET MVC 整合 EntLib 實現自動化異常處理:實例篇

     編輯:關於ASP.NET

異常處理的困境

try/catch/finally 雖熟悉,但何處捕捉、何時記錄、何時封裝、何時替換、何時重拋往往模糊。合理的異常處理應為場景驅動、可配置,EntLib EHAB 正是優秀選擇。

實例場景:用戶登入驗證

Model

public class LoginInfo
{
    [DisplayName("用戶名")]
    [Required(ErrorMessage = "請輸入{0}")]
    public string UserName { get; set; }
    
    [DisplayName("密碼")]
    [Required(ErrorMessage = "請輸入{0}")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

自訂異常

public class InvalidUserNameException : Exception { }
public class InvalidPasswordException : Exception { }

Controller 套用屬性

[ExceptionPolicy("defaultPolicy")]
public class HomeController : ExtendedController
{
    public ActionResult Index() => View(new LoginInfo());
    
    [HttpPost]
    [HandleErrorAction("OnIndexError")]
    public ActionResult Index(LoginInfo loginInfo)
    {
        if (String.Compare(loginInfo.UserName, "foo", true) != 0)
            throw new InvalidUserNameException();
        if (loginInfo.Password != "password")
            throw new InvalidPasswordException();
        return View(loginInfo);
    }
    
    [HttpPost]
    public ActionResult OnIndexError(LoginInfo loginInfo) => View(loginInfo);
}

EntLib 策略配置 (對應 defaultPolicy)

見實作篇 web.config 範例:包含 Logging Handler (記錄日誌) + Wrap Handler (封裝為 ApplicationException)。

執行流程演示

  1. 用戶提交登入表單 (POST /Home/Index)。
  2. Model 驗證通過,進入 Action。
  3. 用戶名非 foo → 拋出 InvalidUserNameException。
  4. ExtendedController.OnException 攔截:
  • 讀取 [ExceptionPolicy("defaultPolicy")] → 策略名 defaultPolicy。
  • 呼叫 ExceptionPolicy.HandleException(ex, "defaultPolicy"):
  1. Logging Handler 將異常寫入日誌 (含堆疊、分類、嚴重度)。
  2. Wrap Handler 將原始異常封裝為 ApplicationException("系統錯誤")。
  • 非 AJAX 請求 → 讀取 [HandleErrorAction("OnIndexError")] → 找到 OnIndexError Action。
  • HandleErrorActionInvoker 執行 OnIndexError(loginInfo) → 回傳登入 View (保留輸入值)。
  • 設定 filterContext.ExceptionHandled = true,流程結束。

AJAX 請求差異

若為 AJAX 提交 (Request.IsAjaxRequest()),略過 HandleErrorAction,直接回傳 JsonResult 包含異常訊息與堆疊,前端自行處理顯示。

優勢總結

  • 聲明式:屬性標註策略與錯誤頁面,業務邏輯專注核心功能。
  • 可配置:EntLib 配置檔調整處理鏈 (記錄、封裝、替換、重拋) 無需改碼。
  • 情境化:Action/Controller 層級指定不同策略,AJAX/一般請求自動區分回應。
  • 關注點分離:異常處理邏輯集中於基類與配置,不污染 Controller。

總結

實例展示登入場景下,透過 ExtendedController + EntLib EHAB 實現「拋出業務異常 → 自動套用策略 (記錄+封裝) → 依請求類型回應 (錯誤 Action/JSON/預設 View)」完整閉環。此模式極大降低異常處理樣板碼,提升系統健壯性與維護性。

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