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

來源:互聯網
上載者:User

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事件記錄,發郵件給管理員,將錯誤資訊寫入資料庫。具體如下: 1protected void 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    else
11    { Session["CurrentError"] = "Error processing page."; }
12    Server.Transfer("ApplicationError.aspx");
13}
14finally 
15{
16    this.sqlConnection1.Close();
17}

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

在Asp.net開發過程中,我們會遇到很多Exception,不處理這些Exception的話會出現很難看的頁面。
還有一些我們未預料到的Exception,當發生Exception時,我們也必須進行記錄具體位置,以便我們修正錯誤。
asp.net異常處理的位置大概有以下3個地方
1. 程式的程式碼片段中,這是最直接處理異常的地方。如下
try
{
    n=Convert.ToInt32(info);
}
catch(Exception)
{
}
只是最基本處理異常的地方。

2. ASP.NET的中的Application_Error中.Application_Error 事件。對於應用程式中引發的任何未處理異常都會引發此事件。一般我們處理如下
protected void Application_Error(Object sender, EventArgs e)
  {
   Exception exp=Server.GetLastError();
   //ErrorLog.Log(exp);
   //====================================
   string strE="內部錯誤:"+e.InnerException.ToString()+"\r\n堆棧:"+e.StackTrace+"\r "+"Message:"+e.Message+"\r 來源:"+e.Source;
   Log(strE);
                        Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }
這樣我們就可以處理Server端出現的錯誤。我們記錄出錯的源頭。

3. 也可以在頁層級或者應用程式層級處理代碼錯誤。Page 基類公開了一個 Page_Error 方法,此方法在頁中可以被重寫。每當運行時引發未捕獲的異常時都調用此方法。
void Page_Error(Object source, 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);
}

 

下面我講述一下怎麼在ASP.NET程式裡面統一的處理異常,我們以最常見的Session到期為例

我們先寫一個Session到期的異常
public class YSessionException:Exception
{
}

我們再定義一個屬性
public int SessionValue
{
     get{ if(Session["SessionValue"]==null)
            {
                throw new YSessionException("");
             }
          }
}

下面我們在Page_Error或者Application_Error中處理這個異常
  {
   Exception exp=Server.GetLastError();
                        if(exp is YSessionException)
                        {
                               ..................
                        }
                        Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }

這樣就可以為我們程式提供很好的Exception處理介面。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.