使用 Visual Basic .NET 在 ASP.NET 中建立自定義錯誤報告頁面

本文說明如何使用 Microsoft Visual Basic .NET 程式代碼來捕捉和回應 ASP.NET 中發生的錯誤。

原始產品版本: Visual Basic .NET,ASP.NET
原始 KB 編號: 308132

摘要

ASP.NET 已改善傳統 Active Server Pages (ASP) 的錯誤處理選項。 在 ASP.NET 中,您可以在應用程式中處理數個不同層級的錯誤。

ASP.NET 中的新功能

ASP.NET 在如何處理和回應錯誤方面提供數個進展。 在傳統的 ASP 中,您會在 JScript) 中處理 (或try-catch區塊的錯誤On Error Resume Next。 或者,如果您執行 Internet Information Services (IIS) ,則會使用 ASPError 物件來建立自定義錯誤報告頁面。 不過,這些方法有其限制。

ASP.NET 提供數個層級,您可以在其中處理和響應當您執行 ASP.NET 應用程式時可能發生的錯誤。 ASP.NET 提供三種主要方法,可讓您在發生錯誤時捕捉和回應錯誤: Page_Error 事件、 Application_Error 事件,以及應用程式組態檔 (Web.config)

本文示範如何在 ASP.NET 應用程式中使用這些新功能。 雖然本文說明如何提供與 ASP.NET 直接相關的自定義錯誤頁面和一般錯誤報告,但本文不會描述其他錯誤處理方法,例如 try-catch-finally 區塊和 Common Language Runtime (CLR) 例外狀況系統。

使用Page_Error事件

Page_Error 事件提供一種方式來捕捉頁面層級發生的錯誤。 您可以 (顯示錯誤資訊,因為要遵循的範例程式代碼會) ,或者您可以記錄事件或執行一些其他動作。

注意事項

此範例只會在瀏覽器中顯示詳細的錯誤資訊,以供示範之用。 向應用程式的終端用戶顯示詳細資訊時,請小心謹慎,尤其是在應用程式在因特網上執行時。 更適當的動作是向使用者顯示訊息,通知他們發生錯誤,然後實際記錄事件記錄檔中的特定錯誤詳細數據。

此範例會擲回 Null 例外狀況,這會強制在 事件中發生 Page_Load 錯誤。 請遵循下列步驟來建立將測試事件的 Page_Error 初始頁面。

  1. 請遵循下列步驟,將名為 PageEvent.aspx 的新檔案新增至您的專案:

    1. 開啟 Visual Studio .NET。
    2. 在 方案總管 中,以滑鼠右鍵按兩下項目節點,指向[新增],然後按兩下 [新增Web窗體]
    3. 在 [ 名稱] 文本框中,輸入 PageEvent.aspx,然後按兩下 [ 開啟]
  2. 將下列程式代碼新增至 PageEvent.aspx

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. 從 [檔案] 功能表中,單擊 [儲存PageEvent.aspx]。

  4. 以滑鼠右鍵按下頁面,然後按兩下 [在瀏覽器中 檢視 ] 來執行頁面。 請注意,系統會根據程式代碼規格擲回並報告錯誤。

注意事項

您可能會注意到程式代碼會發出 對的 Server.ClearError呼叫。 這可防止錯誤繼續 Application_Error 處理事件。

使用Application_Error事件

Page_Error與 事件類似,您可以使用 Application_Error 事件來捕捉應用程式中發生的錯誤。 由於事件的全應用程式範圍,您可以記錄應用程式錯誤資訊,或處理可能發生的其他應用層級錯誤。

下列範例是以上述 Page_Error 事件程式代碼範例為基礎,如果事件中的錯誤 Page_Load 未在事件中擷取 Page_Error ,則會引發此範例。 事件 Application_Error 是在應用程式的 Global.asax 檔案中指定。 為了簡單起見,本節中的步驟會建立新的頁面,以在其中擲回例外狀況、在 Application_ErrorGlobal.asax 檔案的事件中捕捉錯誤,並將錯誤寫入事件記錄檔。 下列步驟示範如何使用 Application_Error 事件:

  1. 將名為 AppEvent.aspx 的新檔案新增至您的專案。

  2. 將下列程式代碼新增至 AppEvent.aspx

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. 從 [檔案] 功能表中,按兩下 [儲存AppEvent.aspx]。

  4. Application_Error將 事件新增至 Global.asax 檔案,以捕捉您在Page_LoadAppEvent.aspx頁面事件中擲回的錯誤。 請注意,您必須將命名空間的 System.Diagnostics 語句新Imports增至 Global.asax,才能使用事件記錄檔。

    將下列程式代碼新增至 Global.asax 檔案:

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. 儲存 Global.asax 檔案。

  6. 在 Visual Studio .NET 的 [ 建置 ] 功能表上,單擊 [ 建置]

  7. 以滑鼠右鍵按下頁面,然後按兩下 [在瀏覽器中 檢視 ]。 在此情況下,頁面會是空白的,不過,您應該會注意到事件記錄檔中已加入新的專案。 此範例會在應用程式記錄檔中建立專案,可從 事件檢視器 存取。 記錄錯誤之後,您可能會想要將使用者重新導向至另一個更方便使用的錯誤頁面,或視需要執行一些額外的動作。

使用 Web.config 檔案

如果您未在 或 Application_Error 事件中呼叫Server.ClearError或捕捉錯誤Page_Error,則會根據Web.config檔案區段中的<customErrors>設定來處理錯誤。 在區段中 <customErrors> ,您可以將重新導向頁面指定為預設的錯誤頁面 () defaultRedirect ,或根據引發的超文本傳輸通訊協定 (HTTP) 錯誤碼,指定給特定頁面。 您可以使用這個方法來自定義使用者收到的錯誤訊息。

如果在應用程式的任何先前層級未捝取錯誤,則會顯示此自定義頁面。 本節示範如何修改 Global.asax 檔案, Server.ClearError 以便永遠不會呼叫。 因此,系統會在 Web.config 檔案中處理錯誤,作為捕捉錯誤的最後一點。

  1. 開啟上一個範例中的 Global.asax 檔案。

  2. 將行 Server.ClearError 批注化,以確保錯誤會出現在 Web.config 檔案中。

  3. 將您的變更儲存至 Global.asax。 您的程式代碼現在看起來應該如下所示:

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. 將下列程式代碼新增至 區段, <customErrors> 以將使用者重新導向至自訂頁面:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    注意事項

    您必須修改 屬性中的 defaultRedirect 檔案路徑,使其參考相關的 Web 伺服器和應用程式名稱。

  5. 由於此層級所擷取的錯誤會傳送至預設錯誤頁面,因此您必須建立名為的錯誤頁面 ,ErrorStatus.htm。 請記住,您使用此方法來控制呈現給用戶的內容,因此此範例會使用 錯誤頁面的.htm 頁。 將下列程式代碼新增至 ErrorStatus.htm

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. 若要測試程序代碼,請儲存盤案、建置專案,然後在瀏覽器中檢視 AppEvent.aspx 。 請注意,當擲回錯誤時,系統會將您重新導向至 ErrorStatus.htm 頁面。 雖然您可以參考區段中 屬性值 defaultRedirect 中的 <customErrors> 預設錯誤頁面,但您也可以根據引發的 HTTP 錯誤碼,指定要重新導向的特定頁面。 子 <error> 項目允許這個選項。 例如:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

注意事項

區段中 defaultRedirect 指定的 <customErrors> 頁面是 .htm 檔案。 如果您想要在和範例 () 的.aspx頁面Page_ErrorApplication_Error中使用 GetLastError ,則必須先將例外狀況儲存在會話變數或其他方法中,才能進行重新導向。

請注意,區 <customErrors> 段包含 mode 設定為 On 的屬性。 屬性 mode 可用來控制錯誤重新導向的發生方式。 例如,如果您正在開發應用程式,您最可能想要查看實際的 ASP.NET 錯誤訊息,而不想重新導向至更方便使用的錯誤頁面。 屬性 mode 包含下列設定:

  • On:未處理的例外狀況會將使用者重新導向至指定 defaultRedirect 的頁面。 這 mode 主要用於生產環境。

  • Off:使用者會收到例外狀況資訊,而且不會重新導向至 defaultRedirect 頁面。 這 mode 主要用於開發。

  • RemoteOnly:只有使用localhost存取本機電腦上網站 (的使用者) 收到例外狀況資訊。 所有其他用戶都會重新導向至 defaultRedirect 頁面。 此模式主要用於偵錯。

疑難排解

在 Windows 上的預設安裝中,ASP.NET 在背景工作進程中執行 Web 應用程式程式代碼。 此程式的身分識別預設為稱為 ASPNET 帳戶的無特殊許可權本機帳戶。 在Beta版本的 ASP.NET 中,進程身分識別是System,這是一個功能強大的系統管理帳戶,在電腦上具有許多許可權。

在 Windows Server (IIS) 的預設安裝中,ASP.NET 在背景工作進程中執行 Web 應用程式程式代碼。 此程式的身分識別預設為名為 NetworkService 的有限帳戶。

如需此變更及其如何影響執行本文中程式代碼的詳細資訊,以及可能需要其他訪問許可權的其他程序代碼,請參閱 模式 & 做法

參考資料