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

.NET 未捕獲異常全方位處理策略:從原理到三大應用類型實戰

     編輯:關於ASP.NET

未捕獲異常的兩大盲區

即使全代碼覆蓋 try-catch,仍有兩類異常無法攔截:

  1. GC 觸發異常:Finalize 方法中拋出的異常,或內存耗盡導致的 GC 失敗
  2. 非主線程異常:線程池、Timer、第三方組件內部線程拋出的異常(.NET 2.0+ 默認終止進程)

UnhandledExceptionEventHandler 事件機制

AppDomain.CurrentDomain.UnhandledException += (sender, e) => {
    Exception ex = (Exception)e.ExceptionObject;
    bool isTerminating = e.IsTerminating; // .NET 2.0+ 恆為 true
    
    // 關鍵動作:日誌記錄、數據備份、告警通知
    Log.Fatal("未捕獲異常", ex);
    BackupCriticalData();
    AlertOpsTeam(ex);
};

三大應用類型差異化處理

1. WinForms / WPF 桌面應用

// Program.cs 入口點
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += (s, e) => HandleUIThreadException(e.Exception);
AppDomain.CurrentDomain.UnhandledException += (s, e) => HandleNonUIThreadException(e.ExceptionObject as Exception);

關鍵點:UI 線程異常可選擇不終止進程(UnhandledExceptionMode.CatchException),非 UI 線程異常必須記錄並優雅退出。

2. ASP.NET Web Forms / MVC

<!-- Web.config -->
<system.web>
  <customErrors mode="On" defaultRedirect="/Error.html">
    <error statusCode="500" redirect="/500.html" />
  </customErrors>
</system.web>

// Global.asax
protected void Application_Error() {
    var ex = Server.GetLastError();
    Log.Error("Web未捕獲異常", ex);
    // 發送郵件、寫入事件日誌等
    Server.ClearError();
    Response.Redirect("/Error.html");
}

3. Windows Service / Console 後台服務

// 必須訂閱,否則靜默失敗無感知
AppDomain.CurrentDomain.UnhandledException += (s, e) => {
    var ex = e.ExceptionObject as Exception;
    Log.Fatal("服務崩潰", ex);
    // 嘗試重啟邏輯或通知監控系統
    Environment.Exit(1); // 非零退出碼觸發服務管理器重啟
};

黃金法則

  1. 全局處理器只做「記錄、備份、告警、退出」,不做業務邏輯恢復
  2. 業務代碼必須在局部 try-catch 中處理可預期異常
  3. 定期演練異常注入測試,驗證處理鏈路有效性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved