使用 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
事件的初始頁面。
請遵循下列步驟,將名為 PageEvent.aspx 的新檔案新增至您的專案:
- 開啟 Visual Studio .NET。
- 在 方案總管 中,以滑鼠右鍵按兩下項目節點,指向 [新增],然後按兩下 [新增Web窗體]。
- 在 [ 名稱] 文本框中,輸入 PageEvent.aspx,然後按兩下 [ 開啟]。
將下列程式代碼新增至 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>
從 [檔案] 功能表中,按兩下 [儲存PageEvent.aspx]。
以滑鼠右鍵按下頁面,然後按兩下 [在瀏覽器中檢視 ] 以執行頁面。 請注意,錯誤會根據程式代碼規格擲回並報告。
注意
您可能會注意到程式代碼會發出 對 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
事件:
將名為 AppEvent.aspx 的新檔案新增至您的專案。
將下列程式代碼新增至 AppEvent.aspx:
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
從 [檔案] 功能表中,單擊 [儲存AppEvent.aspx]。
將
Application_Error
事件新增至 Global.asax 檔案,以擷取您在AppEvent.aspx頁面中擲回Page_Load
的錯誤。 請注意,您必須將 命名空間的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
儲存 Global.asax 檔案。
在 Visual Studio .NET 的 [ 建 置] 功能表上,單擊 [建置]。
以滑鼠右鍵按下頁面,然後按兩下 [在瀏覽器中檢視 ]。 在此情況下,頁面會是空白的,但您應該注意到事件記錄檔中已新增新的專案。 此範例會建立應用程式記錄檔中的專案,可從 事件檢視器 存取。 記錄錯誤之後,您可能會想要將使用者重新導向至另一個更方便使用的錯誤頁面,或視需要執行一些額外的動作。
使用 Web.config 檔案
如果您未在 或 Application_Error
事件中Page_Error
呼叫Server.ClearError
或設陷錯誤,則會根據 Web.config 檔案區段中的設定<customErrors>
來處理錯誤。 在區 <customErrors>
段中,您可以將重新導向頁面指定為預設錯誤頁面 (defaultRedirect
), 或根據引發的超文本傳輸通訊協定 (HTTP) 錯誤碼指定給特定頁面。 您可以使用這個方法來自定義使用者收到的錯誤訊息。
如果發生未在應用程式中任何上一個層級所截獲的錯誤,則會顯示此自定義頁面。 本節示範如何修改 Global.asax 檔案, Server.ClearError
讓永遠不會呼叫。 因此,錯誤會在 Web.config 檔案中處理為最後一個陷阱錯誤點。
從上一個範例開啟 Global.asax 檔案。
Server.ClearError
將這一行批注化,以確保錯誤出現在 Web.config 檔案中。將變更儲存至 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
將下列程式代碼新增至
<customErrors>
區段,以將使用者重新導向至自訂頁面:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
注意
您必須修改 屬性中的
defaultRedirect
檔案路徑,使其參考相關的 Web 伺服器和應用程式名稱。由於此層級所截獲的錯誤會傳送至預設錯誤頁面,因此您必須建立名為 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>
若要測試程序代碼,請儲存盤案、建置專案,然後在瀏覽器中檢視 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頁面中使用 GetLastError
,Application_Error
Page_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 的有限帳戶。
如需這項變更的詳細資訊,以及如何影響本文中的程序代碼,以及可能需要其他訪問許可權的其他程式代碼,請參閱 模式和做法