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

打造 ASP.NET 網站統一例外處理機制:從基類到全域攔截

     編輯:關於ASP.NET

為什麼需要統一例外處理

網站面對多樣的使用者、瀏覽器、網路環境,例外狀況難以完全避免。將例外分為兩類:

  1. 可預期例外:開發時已知可能發生(如資料庫連線失敗、檔案不存在),應就地捕獲處理。
  2. 不可預期例外:超出開發者預測範圍(如記憶體不足、第三方元件錯誤),需統一機制捕獲、記錄、友善回饋。

反面教材:將例外當流程控制

// 不好:用例外處理預設值
int temp = 0;
try { temp = Int32.Parse(input); }
catch { temp = 1; }
// 好:使用 TryParse
int temp = 0;
if (!Int32.TryParse(input, out temp)) temp = 1;

方案一:自訂 Page 基類

建立 `BasePage : System.Web.UI.Page`,在建構子註冊 `Error` 事件:

public class BasePage : Page
{
 public BasePage() { this.Error += PageBase_Error; }

 protected void PageBase_Error(object sender, EventArgs e)
 {
 Exception ex = Server.GetLastError();
 if (ex == null) return;

 LogError(ex); // 記錄日誌、發送通知

 string msg = "系統發生錯誤,請稍後再試或聯繫管理員。";
 #if DEBUG
 msg = ex.Message + "<br/>Stack: " + ex.StackTrace;
 #endif

 Response.Write(msg);
 // 或 Response.Redirect("Error.html"); // 靜態錯誤頁最安全
 Server.ClearError();
 }

 protected virtual void LogError(Exception ex) { /* 實作記錄邏輯 */ }
}

所有頁面繼承 `BasePage` 即可自動套用。若專案已有大量頁面,可在 `web.config` 設定 `pageBaseType` 強制套用。

方案二:Global.asax Application_Error

全域攔截未處理例外,適合集中記錄與導向:

protected void Application_Error(object sender, EventArgs e)
{
 Exception ex = Server.GetLastError();
 if (ex == null) return;

 LogError(ex);
 // 避免遞迴錯誤,導向靜態頁
 Server.Transfer("~/Error.html");
 // 或 Response.Redirect("~/Error.aspx?code=500");
}

進階:自訂錯誤頁面與 HTTP 狀態碼

<system.web>
 <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx">
 <error statusCode="404" redirect="~/404.aspx" />
 <error statusCode="500" redirect="~/500.aspx" />
 </customErrors>
</system.web>

在 `Error.aspx` 中可讀取 `Server.GetLastError()` 並顯示友善訊息,記得呼叫 `Server.ClearError()`。

最佳實踐建議

  • 區分開發/正式環境:DEBUG 顯示詳細堆疊,RELEASE 只顯示友善訊息。
  • 錯誤頁面務必為靜態 HTML 或極簡頁面,避免錯誤頁面本身再拋出例外造成無限迴圈。
  • 記錄完整資訊:例外類型、訊息、堆疊、使用者身分、請求 URL、表單資料、時間戳記。
  • 整合日誌框架:log4net、NLog、Serilog 等,支援多目標輸出(檔案、資料庫、Email、Slack)。
  • 針對特定例外類型(如 `SqlException`、`HttpRequestValidationException`)提供專屬處理邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved