如何建立自訂的錯誤報告使用視覺 C#.NET 的 ASP.NET 中的網頁

文章翻譯 文章翻譯
文章編號: 306355 - 檢視此文章適用的產品。
本文曾發行於 CHT306355
全部展開 | 全部摺疊

在此頁中

結論

本文說明如何使用 Visual C#.NET 程式碼來截取並回應錯誤發生在 ASP.NET 中的時候。ASP.NET 有改進的錯誤處理選項從傳統 Microsoft 動態伺服器網頁 (ASP)。在 ASP.NET,您可以在應用程式中處理數個不同層級的錯誤。

在 ASP.NET 中的新功能

ASP.NET 提供數個進步如何處理並回應錯誤。在傳統 ASP 中您要處理錯誤 」 的錯誤 Resume Next"(或在 JScript 中的try-catch區塊)。或者,如果您正在執行 Microsoft Internet Information Services (IIS) 5.0,您使用ASPError物件來建立自訂的錯誤報告的網頁。不過,這種方法都有其限制。

ASP.NET 提供數個層級,此時,您可以處理並回應執行 ASP.NET 應用程式時可能發生的錯誤。ASP.NET 提供可讓您來截取並回應錯誤發生時的三種主要方法: Page_ErrorApplication_Error,以及應用程式組態檔 (Web.config)。

本文將示範如何在 ASP.NET 應用程式中使用這些新功能。雖然這篇文章說明如何提供自訂錯誤頁面和一般的錯誤報告與直接與 ASP.NET 相關,這份文件不會說明其他的錯誤處理方法,例如try-catch-finally區塊和通用語言執行階段 (CLR) 例外狀況系統。

如何使用 Page_Error 方法

Page_Error事件處理常式提供方法來截取發生在頁面層級的錯誤。(如,請依照下列的範例程式碼),就可以只顯示資訊時發生錯誤,或者您可以記錄事件,或執行其他動作。

附註本範例僅供示範之用瀏覽器中顯示詳細的錯誤資訊。您會想要顯示給一般使用者的應用程式的詳細的資訊,尤其是在網際網路上執行應用程式時請務必謹慎。更適當的動作會顯示訊息給使用者,通知他們發生錯誤,然後實際上在事件記錄檔中記錄的特定錯誤詳細資料。

本範例會擲回 null 的例外狀況,會強制在Page_Load事件處理常式中發生錯誤。請遵循這些步驟來建立將會示範使用Page_Error事件處理常式的初始網頁。
  1. 請依照下列步驟執行,以新增新的檔名為 PageEvent.aspxto 您的專案:
    1. 開啟的 Microsoft Visual Studio.NET。
    2. 在 [方案總管專案節點上按一下滑鼠右鍵,指向 [新增],然後按一下加入 Web Form
    3. 在 [名稱] 文字方塊中,輸入 PageEvent.aspx然後按一下 [開啟
  2. 將下列程式碼加入至 PageEvent.aspx:
    <script language=C# runat="server">
    void Page_Load(object sender, System.EventArgs e)
    {
    	throw(new ArgumentNullException());
    }
    
    public void Page_Error(object sender,EventArgs e)
    {
    	Exception objErr = Server.GetLastError().GetBaseException();
    	string err =	"<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();
    }
    </script> 
    					

    附註在這個程式碼範例中, AutoEventWireup屬性未明確設定。如果您未明確執行 assigna 的AutoEventWireup屬性的值,則會使用預設值,則為 true 。如果您使用 Visual Studio.NET 開發 yourapplications,Web 表單範本程式碼明確地設定AutoEventWireup屬性值為false。沒有預設值 thatASP.NET 用途中, 重要的差異,而預設值,Visual Studio.NET 範本 codeassigns,這個屬性。如果AutoEventWireup屬性值設為false,以宣告的事件處理常式。ASPX 頁面不要 notfire。這可能是令人混淆,如果您不知道 thisfunctionality。
  3. 從 [檔案] 功能表中,按一下 [儲存 PageEvent.aspx]。
  4. 以滑鼠右鍵按一下頁面],然後按一下 [在瀏覽器中的檢視,以執行網頁。請注意,會擲回錯誤,程式碼規格的 reportedaccording。
附註您可能會發現程式碼會發出對Server.ClearError的呼叫。如此可避免這個錯誤繼續Application_Error事件處理常式。

此外,您應該也注意Inherits屬性@ Page指示詞中。如果設定Inherits ,您必須先建置專案,才能您瀏覽至頁面。如果您不先建置專案,您會收到下列錯誤訊息:
'Project.PageEvent' 不是有效的型別

如何使用 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 為 yourproject。
  2. 將下列程式碼加入至 AppEvent.aspx:
    <script language=C# runat="server">
    	void Page_Load(object sender, System.EventArgs e)
    	{
    		throw(new ArgumentNullException());
    	}
    </script>
    					

    附註AutoEventWireup屬性的相關 「Page_Error」 一節中所討論的資訊也適用於在這個步驟中的程式碼範例。如需詳細資訊 」Page_Error」 一節中的 theinformation,請參閱。
  3. 從 [檔案] 功能表中,按一下 [儲存 AppEvent.aspx]。
  4. Application_Error事件處理常式加入 Global.asax 檔案來截獲錯誤的 youthrow AppEvent.aspx 頁面的Page_Load事件處理常式中。請注意您必須使用 addanother Global.asax 使用事件記錄檔的System.Diagnostics命名空間的using陳述式。

    ︰ 程式碼加入 Global.asax 檔案:
    using System.Diagnostics;
    
    protected void Application_Error(object sender, EventArgs e)
    {
    	Exception objErr = Server.GetLastError().GetBaseException();
    	string err =	"Error Caught in Application_Error event\n" +
    			"Error in: " + Request.Url.ToString() +
    			"\nError Message:" + objErr.Message.ToString()+ 
    			"\nStack Trace:" + objErr.StackTrace.ToString();
    	EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    	Server.ClearError();
    	//additional actions...
    } 
    					
  5. 儲存 Global.asax 檔案。
  6. 在 Visual Studio.NET 中,在 [建置] 功能表上按一下 [建置
  7. 以滑鼠右鍵按一下頁面],然後按一下 [在瀏覽器中的檢視。在此情況下,網頁將會是空白,不過,您應該的 noticethat 已在事件記錄檔中加入新項目。這個範例會讓應用程式記錄檔,也就是從事件檢視器可存取中的項目。Loggingthe 發生錯誤後可能會想要將使用者重新導向至另一個 「 更多使用者 friendlyerror 頁面,或視需要執行一些其他的動作。

如何使用 Web.config 檔

如果您不會呼叫Server.ClearError或設陷Page_ErrorApplication_Error事件處理常式中的錯誤訊息、 錯誤處理基礎的 Web.config 檔案的 [ <customErrors>] 區段中的設定。在 [ <customErrors>] 區段中,您可以指定為預設錯誤網頁 (defaultRedirect) 的重新導向頁面,或指定到特定頁面,就會引發的 HTTP 錯誤程式碼為基礎。您可以使用這個方法來自訂使用者會收到錯誤訊息。

如果發生錯誤時,不受困在任何應用程式中的前一個層級,會顯示此自訂頁面。這一節說明如何修改 Global.asax 檔案,因此絕不會呼叫Server.ClearError 。其結果是,錯誤是在 Web.config 檔中當做處理設陷錯誤的最後一個點。 </customErrors></customErrors>
  1. 從 previousexample 開啟 Global.asax 檔案。
  2. 標記為註解Server.ClearError行,以確保在 Web.configfile 中的錯誤表面。
  3. 將您的變更儲存到 Global.asax。您的程式碼應該類似下列的 nowappear:
    using System.Diagnostics;
    
    protected void Application_Error(object sender, EventArgs e)
    {
    	Exception objErr = Server.GetLastError().GetBaseException();
    	string err =	"Error Caught in Application_Error event\n" +
    			"Error in: " + Request.Url.ToString() +
    			"\nError Message:" + objErr.Message.ToString() + 
    			"\nStack Trace:" + objErr.StackTrace.ToString();
    	EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    	//Server.ClearError();
    	//additional actions...
    } 
    					
  4. 加入下列程式碼,以<customErrors>sectionto 使用者重新導向至自訂的頁面:<b00> </b00> </customErrors>
    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    						
    附註您必須修改defaultRedirect屬性中的檔案路徑,使其參照相關的 Web 伺服器 andapplication 名稱。
  5. 因為在此層級截獲的錯誤是 sentto 預設錯誤網頁,您必須建立名為 ErrorStatus.htm.Keep,別忘了,您正在使用這個方法來控制讓這個範例使用.htm 網頁錯誤頁面呈現給 theuser,錯誤頁面。將 followingcode 加入至 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>子項目。例如:<b00> </b00> </error> </customErrors>
<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
	<error statusCode="404" redirect="filenotfound.htm" />
</customErrors>
				
附註DefaultRedirect的<customErrors>一節中所指定的頁面是.htm 檔案。我

請注意 [ <customErrors>] 區段包含一個模式屬性來設定為OnMode屬性用來控制發生錯誤的重新導向的方式。例如,如果您正在開發應用程式,您可能想要看到實際的 ASP.NET 錯誤訊息而且不想被重新導向到更好用的錯誤網頁。Mode屬性包括下列設定值: </customErrors></customErrors>
  • : 將使用者重新導向至指定的defaultRedirect網頁處理的例外狀況。此模式主要用於實際執行。
  • 關閉: 使用者會收到例外狀況資訊,而且不是 redirectedto defaultRedirect頁面。此模式主要用於開發。
  • RemoteOnly: 僅限來存取本機電腦上的網站 (usinglocalhost) 的使用者會收到例外狀況資訊。所有其他的使用者重新導向至defaultRedirect頁面。此模式主要是用來偵錯。

疑難排解

在其預設安裝在 Microsoft Windows 2000 和 Microsoft Windows XP 中,ASP.NET 會在背景工作處理序中執行 Web 應用程式程式碼。這個處理序識別預設為未具權限的本機帳戶,稱為 ASPNET 帳戶。在 beta 版的 ASP.NET 處理序識別身份是系統,以許多的權限的電腦上的強大功能系統管理帳戶。

在其預設安裝在 Windows Server 2003 (IIS 6) 中,ASP.NET 會在背景工作處理序中執行 Web 應用程式程式碼。這個處理序識別預設為受限制的帳戶稱為 「 網路服務。

如需有關這項變更,以及它如何影響執行本文中的程式碼和其他其他可能需要額外的存取權限的程式碼的詳細資訊,請造訪下列網站:
第 1 版的 Microsoft.NET Framework 的安全性變更
http://msdn2.microsoft.com/en-us/library/ms994923.aspx

?考

如需詳細資訊,請造訪下列 Microsoft 網站:
在.NET 中的例外狀況管理

HttpServerUtility.ClearError 方法

MSDN.NET 開發中心

Microsoft.NET 首頁

屬性

文章編號: 306355 - 上次校閱: 2013年10月29日 - 版次: 5.0
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 標準版
關鍵字:?
kbconfig kbhowtomaster kbweb kbmt KB306355 KbMtzh
機器翻譯
請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。
按一下這裡查看此文章的英文版本:306355
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com