共用方式為


使用 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 On Error Resume Next 中的錯誤(或 try-catch 區塊)。 或者,如果您正在執行 網際網路資訊服務 (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 檔案中指定。 為了簡單起見,本節中的步驟會建立新的頁面,以擲回例外狀況、在 Global.asax 檔案事件Application_Error攔截錯誤,並將錯誤寫入事件記錄檔。 下列步驟示範如何使用 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 檔案,以擷取您在AppEvent.aspx頁面中擲回Page_Load的錯誤。 請注意,您必須將 命名空間的 System.Diagnostics 語句新增ImportsGlobal.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 事件中Page_Error呼叫Server.ClearError或設陷錯誤,則會根據 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 頁面。 雖然您可以在 區段中的 屬性值<customErrors>defaultRedirect參考預設錯誤頁面,但您也可以根據引發的 HTTP 錯誤碼,指定要重新導向的特定頁面。 <error>子項目允許這個選項。 例如:

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

注意

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

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

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

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

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

疑難排解

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

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

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

參考資料