使用 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
初始頁面。
請遵循下列步驟,將名為 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 檔案中指定。 為了簡單起見,本節中的步驟會建立新的頁面,以在其中擲回例外狀況、在 Application_Error
Global.asax 檔案的事件中捕捉錯誤,並將錯誤寫入事件記錄檔。 下列步驟示範如何使用 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 檔案,以捕捉您在Page_Load
AppEvent.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
儲存 Global.asax 檔案。
在 Visual Studio .NET 的 [ 建置 ] 功能表上,單擊 [ 建置]。
以滑鼠右鍵按下頁面,然後按兩下 [在瀏覽器中 檢視 ]。 在此情況下,頁面會是空白的,不過,您應該會注意到事件記錄檔中已加入新的專案。 此範例會在應用程式記錄檔中建立專案,可從 事件檢視器 存取。 記錄錯誤之後,您可能會想要將使用者重新導向至另一個更方便使用的錯誤頁面,或視需要執行一些額外的動作。
使用 Web.config 檔案
如果您未在 或 Application_Error
事件中呼叫Server.ClearError
或捕捉錯誤Page_Error
,則會根據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 頁面。 雖然您可以參考區段中 屬性值
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_Error
Application_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 的有限帳戶。
如需此變更及其如何影響執行本文中程式代碼的詳細資訊,以及可能需要其他訪問許可權的其他程序代碼,請參閱 模式 & 做法
參考資料
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應