1. 程式人生 > >ASP.NET錯誤處理的方式(總結)

ASP.NET錯誤處理的方式(總結)

ASP.NET錯誤處理的方式(整理&總結)
英文文章研究:http://wrfwjn.blog.hexun.com/4172839_d.html
總述:
要建立頁中的全域性處理程式,請建立 Page_Error 事件的處理程式。要建立應用程式範圍的錯誤處理程式,請在 Global.asax 檔案中將程式碼新增到 Application_Error 方法。只要您的頁或應用程式中發生未處理的異常,就會呼叫這些方法。您可以從 HttpServerUtility.GetLastError 方法獲取有關最新錯誤的資訊。
注意   如果您具有全域性錯誤處理程式,則它優先於在 Web.config customErrors 元素的 defaultRedirect 屬性中指定的錯誤處理。

原則(MSDN):在您的應用程式顯示錯誤資訊時,它不應該洩露有助於惡意使用者攻擊您系統的資訊。例如,如果您的應用程式試圖登入資料庫時沒有成功,則顯示的錯誤資訊不應該包括它正在使用的使用者名稱。

有許多方法可以控制錯誤資訊:

將應用程式配置為不向遠端(應用程式)使用者顯示詳細錯誤資訊。您也可以選擇將錯誤重定向到應用程式頁。
只要可行就包括錯誤處理,並編寫您自己的錯誤資訊。在您的錯誤處理程式中,您可以進行測試以確定使用者是否為本地使用者並作出相應的響應。
在捕捉所有未處理異常並將它們傳送到一般錯誤頁的頁級別或應用程式級別上,建立全域性錯誤處理程式。這樣,即使您沒有預料到某個問題,至少使用者不會看到異常頁。

<一>頁面級的錯誤處理


void Page_Error(Object sender, EventArgs e) {
    String message 
="<font face=verdana color=red>"
                           
+"<h4>"+ Request.Url.ToString() +"</h4>"
                           
+"<pre><font color='red'>"+ Server.GetLastError().ToString() +"</pre>"
                           
+"</font>";

    Response.Write(message);
    Server.ClearError();
}


注:通過使用 Server 物件訪問來自伺服器的錯誤資訊。特別地,該示例從 Request 物件獲取請求的 URL,以及 Server 物件的最新錯誤(使用 GetLastError 方法),並將這兩者都轉換為客戶端可以顯示的字串。將 message 變數寫入客戶端後,通過使用 ClearError 方法刪除該錯誤

<二>應用程式級的錯誤事件中,錯誤處理方式如下:global.asax檔案中的application_error中新增處理 邏輯,可新增其它操作,如寫入windows事件日誌,發郵件給管理員,將錯誤資訊寫入資料庫。具體如下:

 1protectedvoid Application_Error(Object sender, EventArgs e)
 2        {
 3            String Message ="/n/nURL:/n http://localhost/"+ Request.Path
 4                +"/n/nMESSAGE:/n "+ Server.GetLastError().Message
 5                +"/n/nSTACK TRACE:/n"+ Server.GetLastError().StackTrace;
 6            //寫入windows事件日誌 7            String LogName ="Application";
 8            if (!EventLog.SourceExists(LogName)) 
 9            {
10                EventLog.CreateEventSource(LogName, LogName);
11            }
12            EventLog Log =new EventLog();
13            Log.Source = LogName;
14            Log.WriteEntry(Message, EventLogEntryType.Error);
15        }


<三>web.config中,自定義錯誤資訊。將應用程式配置為不向遠端使用者顯示錯誤

<customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> 
   
<error statusCode="404" redirect="NoSuchPage.aspx"/> 
   
<error statusCode="403" redirect="NoAccessAllowed.aspx"/> 
</customErrors>


注:將 mode 屬性設定為 RemoteOnly(區分大小寫)。這就將應用程式配置為僅向本地使用者(您和開發人員)顯示詳細的錯誤。
(可選)包括指向應用程式錯誤頁的 defaultRedirect 屬性。
(可選)包括將錯誤重定向到特定頁的 <error> 元素。例如,您可以將標準 404 錯誤(未找到頁)重定向到您自己的應用程式頁。

<四> 包括錯誤處理 (MSDN)
1.在可能產生錯誤的任何語句前後使用 try-catch-finally 塊。
2.(可選)使用 Context 物件的 UserHostAddress 屬性對本地使用者進行測試並相應地修改錯誤處理。值 127.0.0.1 等效於“localhost”並指示瀏覽器與 Web 伺服器位於同一臺計算機上。
   下面顯示的是一個示例錯誤處理塊。如果發生錯誤,則用有關訊息的詳細資訊載入 Session 狀態變數,然後應用程式顯示可以讀取 Session 變數並顯示錯誤的頁。(有意寫入此錯誤以便不向使用者提供任何可利用的詳細資訊。)如果使用者是本地使用者,則提供不同的錯誤詳細資訊。在 finally 塊中,釋放開放式資源。

 1try 2{
 3    sqlConnection1.Open();
 4    sqlDataAdapter1.Fill(dsCustomers1);
 5}
 6catch (Exception ex)
 7{
 8    if(HttpContext.Current.Request.UserHostAddress =="127.0.0.1")
 9    { Session["CurrentError"= ex.Message; }10    else11    { Session["CurrentError"="Error processing page."; }12    Server.Transfer("ApplicationError.aspx");
13}
14finally15{
16    this.sqlConnection1.Close();
17}


您也可以建立一個這樣的錯誤處理程式,它在頁面級別上或為整個應用程式捕捉所有未處理的異常。