程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用C# .NET創建自定義錯誤報告

用C# .NET創建自定義錯誤報告

編輯:關於C語言
  本文介紹如何在 ASP.NET 中發生錯誤時使用 Visual C# .NET 代碼捕獲和響應錯誤。ASP.NET 改進了傳統的 Microsoft Active Server Page (ASP) 中的錯誤處理選項。在 ASP.Net 中,您可在應用程序中處理若干不同級別的錯誤。

ASP.Net 中的新功能

ASP.Net 在處理和響應錯誤的方式上進行了若干改進。在傳統的 ASP 中,是用"On Error Resume Next"(或在 JScript 中用 try-catch 塊)處理錯誤的。或者,如果您運行的是 Microsoft Internet Information Services (IIS) 5.0,則使用 ASPError 對象創建自定義的錯誤報告頁。然而,這些方法都有其局限性。

ASP.NET 提供了在運行 ASP.NET 應用程序時可能出現的錯誤的若干處理和響應級別。ASP.Net 提供三種用於在出現錯誤時捕獲和響應錯誤的主要方法:page_error 事件、application_error 事件以及應用程序配置文件 (Web.config)。

本文演示如何在 ASP.NET 應用程序中使用這些新功能。盡管本文由於與 ASP.Net 直接相關而介紹了如何提供自定義錯誤頁和一般錯誤報告,但是它並不介紹其他錯誤處理方法,如 try-catch-finally 塊和公共語言運行庫 (CLR) 異常系統。

如何使用 Page_Error 事件

page_error 事件提供一種捕獲在頁級別出現的錯誤的方法。您可以只是顯示錯誤信息(正如下面的示例代碼所示),也可以記錄事件或執行某個其他操作。

備注:此示例在浏覽器中顯示詳細的錯誤信息,提供此示例只是為了進行說明。向應用程序的最終用戶顯示詳細信息(尤其是該應用程序在 Internet 上運行時)一定要小心。更適當的做法是向用戶顯示一條消息,告知已發生錯誤,然後將具體的錯誤詳細信息記錄在事件日志中。

本示例引發一個強迫錯誤發生在 Page_Load 事件中的空異常。按照以下步驟可創建將測試 Page_Error 事件的初始頁。

按照以下步驟將名為 PageEvent.ASPx 的新文件添加到項目中: 打開 Microsoft Visual Studio .Net。 在"解決方案資源管理器"中,右鍵單擊該項目節點,指向添加,然後單
擊添加 Web 窗體。
在名稱文本框中,鍵入 PageEvent.ASPx,然後單擊打開。 將以下代碼添加到 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 ="error Caught in Page_Error event

" +"
error in:" + Request.Url.ToString() +"
error Message:" + objErr.Message.ToString()+"
stack Trace:
" + objErr.StackTrace.ToString();Response.Write(err.ToString());Server.ClearError();}</SCRIPT>
從文件菜單中,單擊保存 PageEvent.ASPx。 右鍵單擊該頁,然後單擊在浏覽器中查看以運行該頁。請注意,將按照代碼規范引發和報告錯誤。

備注:您可能注意到代碼發出對 Server.ClearError 的調用。這將防止錯誤繼續到要被處理的 Application_Error 事件中。

此外,您還應記下 @ Page 指令中的 inherits 屬性。

如果已經設置 inherits,則必須首先生成項目,然後再浏覽到該頁。

如果不首先生成項目,將看到下面的錯誤信息:

'Project.PageEvent' is not a valid type

如何使用 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=C# runat="server">void Page_Load(object sender, System.EventArgs e){throw(new ArgumentNullException());}</SCRIPT>
從文件菜單中,單擊保存 AppEvent.ASPx。 將 Application_Error 事件添加到 Global.asax 文件中以捕獲在 AppEvent.ASPx 頁的 Page_Load 事件中引發的錯誤。注意,您必須為 System.Diagnostics 名稱空間將另一條 using 語句添加到 Global.asax,才能使用事件日志。

將以下代碼添加到 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...} 
保存 Global.asax 文件。 在 Visual Studio .Net 中,在生成菜單上,單擊生成。 右鍵單擊該頁,然後單擊在浏覽器中查看。在這種情況下該頁將為空白,但是您應該注意到在事件日志中已添加了一個新項。本示例在應用程序日志中生成一個項,可從事件查看器訪問應用程序日志。在記錄錯誤之後,您可能希望將用戶重定向到另一個更用戶友好的錯誤頁或者根據需要執行一些其他操作。

如何使用 Web.config 文件

如果您不調用 Server.ClearError 或者捕獲 Page_Error 或 Application_Error 事件中的錯誤,則將根據 Web.config 文件的 部分中的設置處理錯誤。在 部分,可將重定向頁指定為默認的錯誤頁 (defaultredirect) 或者根據引發的 HTTP 錯誤代碼指定特定頁。您可使用此方法自定義用戶收到的錯誤信息。

如果發生在應用程序以前的任一級別都未捕獲到的錯誤,則顯示這個自定義頁。本節演示如何修改 Global.asax 文件,以便從不調用 Server.ClearError。因此,錯誤在作為捕獲錯誤的最後一點的 Web.config 文件中進行處理。

從上一個示例中打開 Global.asax 文件。 將 Server.ClearError 行注釋掉,以便確保錯誤出現在 Web.config 文件中。 將所作更改保存到 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...} 
將以下代碼添加到 部分,以便將用戶重定向到自定義頁:
<CUSTOMERRORS mode="On" defaultRedirect="http://hostName/applicationName/errorStatus.htm"></CUSTOMERRORS>

備注:必須修改 defaultRedirect 屬性中的文件路徑,以便它

引用相關的 Web 服務器和應用程序名稱。

因為在此級別捕獲的錯誤會發送到默認的錯誤頁,所以,

必須創建一個名為 ErrorStatus.htm 的錯誤頁。請記住,您要使

用此方法來控制向用戶呈現的內容,因此本示例使用 .htm

頁作為錯誤頁。將以下代碼添加到 ErrorStatus.htm 中:

<HTML lang=utf-8 XMLns="http://www.w3.org/1999/xHtml"><HEAD><META content="Microsoft Visual Studio 7.0" name=GENERATOR>custom Error page!
You have been redirected here from the <customErrors> section of theWeb.config file.
若要測試該代碼,請保存這些文件,生成項目,然後在浏覽器中查看 AppEvent.ASPx。請注意,在引發錯誤時,您將被重定向到 ErrorStatus.htm 頁。

盡管您可在 部分中 defaultRedirect 屬性的值中引用默認的錯誤頁,但是您還可根據引發的 HTTP 錯誤代碼指定要重定向到的特定頁。 子元素允許使用此選項。例如:

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

備注:在 部分的 defaultRedirect 中指定的頁是一個 .htm 文件。如果您打算在 .ASPx 頁中使用 GetLastError (正如 Page_Error 和 Application_Error 示例那樣),則在進行重定向之前,必須將異常存儲在會話變量或某個其他方法中。

請注意, 部分包括設置為 On 的 mode 屬性。mode 屬性用於控制錯誤重定向發生的方式。例如,如果您正開發應用程序,則很可能希望查看實際的 ASP.Net 錯誤信息,並且不希望被重定向到更用戶友好的錯誤頁。mode 屬性包括以下設置:

on:未被處理的異常將用戶重定向到指定的 defaultRedirect 頁。此模式主要用於生產。 off:用戶收到異常信息而不是被重定向到 defaultRedirect 頁。此模式主要用於開發。 remoteonly:只有在本地計算機上訪問該站點的用戶(通過使用 localhost)才能收到異常信息。所有其他用戶都被重定向到 defaultRedirect 頁。此模式主要用於調試。

疑難解答

在 Windows 2000 和 Windows XP 上的默認安裝中,ASP.NET 在輔助進程中運行 Web 應用程序代碼。此進程的標識默認為名為 ASPNET 的無特權本地帳戶。在 ASP.Net 的 beta 版中,該進程的標識是 System,這是一個功能強大的管理員帳戶,擁有許多計算機特權。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved