ASP.NET的错误处理机制之一(概念)
對Web應(yīng)用程序來說,發(fā)生不可預(yù)知的錯誤和異常在所難免,我們必須為Web程序提供錯誤處理機制。當錯誤發(fā)生時,我們必須做好兩件事情:一是將錯誤信息記錄日志,發(fā)郵件通知網(wǎng)站維護人員,方便技術(shù)人員對錯誤進行跟蹤處理;二是以友好的方式提示最終用戶頁面發(fā)生了錯誤,而不能將未處理的錯誤信息顯示給用戶。
讓我們想想,ASP.NET為我們提供了幾種錯誤處理機制?如果同時使用他們是不是有一定的優(yōu)先級?.NET提供了四種錯誤處理機制,它們有一定的優(yōu)先級順序:Page_Error事件>ErrorPage屬性>Application_Error事件> <customErrors>配置項。下面分別介紹這四種錯誤處理機制的用法。
1.Page_Error事件
Page_Error 事件提供一種捕獲在頁級別出現(xiàn)的錯誤的方法。您可以只是顯示錯誤信息(正如下面的示例代碼所示),也可以記錄事件或執(zhí)行某個其他操作。
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
throw new Exception("Page Error!");
}
protected void Page_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
Response.Write("Error:" + objErr.Message);
Server.ClearError(); //同樣要注意這句代碼的使用
} 備注:此示例在瀏覽器中顯示詳細的錯誤信息,提供此示例只是為了進行說明。向應(yīng)用程序的最終用戶顯示詳細信息一定要小心。更適當?shù)淖龇ㄊ窍蛴脩麸@示一條消息,告知已發(fā)生錯誤,然后將具體的錯誤詳細信息記錄在日志中。
2.ErrorPage屬性
你幾乎可以在頁面任何時候設(shè)置ErrorPage屬性,從而確定頁面發(fā)生錯誤的時候會重定向至哪個頁面。要讓ErrorPage屬性能夠發(fā)揮作用,<customErrors>配置項中的mode屬性必須設(shè)為"On"。
this.ErrorPage = "~/ErrorHandling/PageError.html";
如果Page_Error和ErrorPage都存在,當拋出Exception時,頁面執(zhí)行順序是怎樣的呢?頁面會先執(zhí)行Page_Error事件處理函數(shù),如果Page_Error()事件中調(diào)用函數(shù)Server.ClearError()清除異常信息,則不會跳轉(zhuǎn)到ErrorPage屬性指定頁面;如果沒有調(diào)用Server.ClearError(),Exception信息會繼續(xù)向上拋,頁面會跳轉(zhuǎn)到ErrorPage指定頁面。這也就證明了優(yōu)先級順序:Page_Error事件>ErrorPage屬性。
3.Application_Error事件
與Page_Error 事件相類似,您可使用Application_Error事件捕獲發(fā)生在應(yīng)用程序中的錯誤。由于事件發(fā)生在整個應(yīng)用程序范圍內(nèi),因此您可記錄應(yīng)用程序的錯誤信息或處理其他可能發(fā)生的應(yīng)用程序級別的錯誤。在Global.asax文件中添加如下代碼就OK了。
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError().GetBaseException();
//實際應(yīng)用中這里可以將Exception信息記Log或是保存到數(shù)據(jù)庫中
//還可以將錯誤發(fā)郵件給網(wǎng)站維護人員
Response.Write("Error:" + ex.Message);
//清除Exception,避免繼續(xù)傳遞給上一級處理
//這里上級就是<CustomerErrors>配置節(jié)了
Server.ClearError();
}
4.<customErrors>配置項
配置文件web.config中的<customErrors> 配置節(jié),可將重定向頁指定為默認的錯誤頁defaultRedirect或者根據(jù)引發(fā)的 HTTP 錯誤代碼指定特定頁。如果發(fā)生在應(yīng)用程序以前的任一級別都未捕獲到的錯誤,則顯示這個自定義頁。
<customErrors mode="On" defaultRedirect="~/ErrorHandling/ApplicationError.html">
<error statusCode="404" redirect="~/ErrorHandling/404.html" />
</customErrors>
同樣,如果Application_Error和<customerErrors>同時存在,也存在執(zhí)行順序的問題。因為優(yōu)先級Application_Error事件> <customErrors>配置項,所以發(fā)生應(yīng)用程序級錯誤時,優(yōu)先執(zhí)行Application_Error事件中的代碼,如果Application_Error事件中調(diào)用了Server.ClearError()函數(shù),<customerErrors>配置節(jié)中的defaultRedirect不起作用,因為Exception已經(jīng)被清除;如果Application_Error事件中沒用調(diào)用了Server.ClearError()函數(shù),錯誤頁會重新定位到defaultRedict指定的URL頁面,為用戶顯示友好出錯信息。
通過對.NET提供的以上四種錯誤處理機制的分析,我們可以把它們從不同的角度分類,便于我們理解和使用。
1.從功能上分類:用于異常處理(Handling exceptions)是Page_Error事件和Application_Error事件;用戶錯誤頁面重定向(Redirecting the user to an error page)的是 ErrorPage屬性 和 <customErrors>配置項。
2.從錯誤處理的范圍分類:用于頁面級(Page level)錯誤處理的是Page_Error事件 和 ErrorPage屬性;用于應(yīng)用程序級(Application level)錯誤處理的是Application_Error事件 和 <customErrors>配置項。
請注意,<customErrors> 部分包括設(shè)置為 On 的 mode 屬性。mode 屬性用于控制錯誤重定向發(fā)生的方式。例如,如果您正開發(fā)應(yīng)用程序,則很可能希望查看實際的 ASP.NET 錯誤信息,并且不希望被重定向到更用戶友好的錯誤頁。mode 屬性包括以下設(shè)置:? On:未被處理的異常將用戶重定向到指定的 defaultRedirect 頁。此模式主要用于生產(chǎn)。
? Off:用戶收到異常信息而不是被重定向到 defaultRedirect 頁。此模式主要用于開發(fā)。
? RemoteOnly:只有在本地計算機上訪問該站點的用戶(通過使用 localhost)才能收到異常信息。所有其他用戶都被重定向到 defaultRedirect 頁。此模式主要用于調(diào)試。
轉(zhuǎn)載于:https://www.cnblogs.com/ding2011/p/4582677.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET的错误处理机制之一(概念)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隐藏实施过程
- 下一篇: 【转】 ADO.NET最佳实践