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

ASP.NET 專案異常處理完整體系:三層級捕獲、健康監視、企業庫整合

     編輯:關於ASP.NET

異常處理非 `try-catch` 而已,需建立應用程式級、頁面級、方法級三層防線,搭配 `web.config`、Health Monitoring、Enterprise Library 實現全方位錯誤管理。

第一層:應用程式級 (Global.asax)


void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();

    // 1. 寫入 Windows 事件日誌
    if (!EventLog.SourceExists("MyApp"))
        EventLog.CreateEventSource("MyApp", "Application");
    EventLog.WriteEntry("MyApp", ex.ToString(), EventLogEntryType.Error);

    // 2. 發送 Email 通知開發團隊
    var mail = new MailMessage("admin@mysite.com", "dev@mysite.com")
    {
        Subject = "【嚴重錯誤】" + Request.Url,
        Body = $"{ex}\n\nURL: {Request.Url}\nUser: {User.Identity.Name}"
    };
    new SmtpClient("smtp.mysite.com").Send(mail);

    // 3. 導向友善錯誤頁
    Server.ClearError();
    Response.Redirect("/Error.aspx");
}

注意:ASP.NET 執行身分 (IIS_IUSRS/ApplicationPoolIdentity) 需具備「事件日誌」寫入權限 (登錄機碼 `HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\Application`)。

第二層:頁面級 (Page_Error / BasePage)


public class BasePage : Page
{
    protected void Page_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        // 記錄頁面級錯誤 (較輕量,不發 Email)
        LogHelper.Write("PageError", ex);
        Server.ClearError();
        Response.Redirect("/PageError.aspx");
    }
}

第三層:方法級 (Try-Catch-Finally 最佳實踐)

  • 捕獲具體例外型別 (`SqlException`、`ArgumentNullException`),避免 `catch (Exception)` 吞沒錯誤。
  • 例外包裝:底層捕獲 `SqlException` → 拋出自訂 `DataAccessException` (內含原始例外 `InnerException`),上層依業務邏輯處理。
  • `finally` 釋放非託管資源 (`DbConnection.Close()`、`fileStream.Dispose()`),或使用 `using` 區塊。

web.config 自訂錯誤頁



  
    
    
  

Health Monitoring (ASP.NET 2.0+ 內建)



  
    
  

零代碼自動記錄所有未處理例外至事件日誌/SQL/Email,支援心跳事件監控應用程式存活狀態。

Enterprise Library Exception Handling Block

  • 策略驅動:定義 `Logging Policy`、`Wrap Policy`、`Replace Policy` 等。
  • 配置檔熱更新,無需重新編譯即可調整記錄目標、格式、嚴重級別。
  • 整合 `Logging Block` 寫入資料庫、平面檔、Email、WMI、MSMQ。

總結建議

  1. 全域 `Application_Error` 為最後防線,記錄完整堆疊、通知團隊、導向錯誤頁。
  2. 頁面級 `Page_Error` 處理特定頁面業務例外 (如驗證失敗)。
  3. 方法級精準捕獲、包裝、轉譯業務異常,`finally`/`using` 保證資源釋放。
  4. 生產環境啟用 Health Monitoring + Enterprise Library,集中管理、彈性擴充。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved