讓我們想想,ASP.NET為我們提供了幾種錯(cuò)誤處理機(jī)制?如果同時(shí)使用他們是不是有一定的優(yōu)先級(jí)?.NET提供了四種錯(cuò)誤處理機(jī)制,它們有一定的優(yōu)先級(jí)順序:Page_Error事件>ErrorPage屬性>Application_Error事件> <customErrors>配置項(xiàng)。下面分別介紹這四種錯(cuò)誤處理機(jī)制的用法。
1.Page_Error事件
Page_Error 事件提供一種捕獲在頁(yè)級(jí)別出現(xiàn)的錯(cuò)誤的方法。您可以只是顯示錯(cuò)誤信息(正如下面的示例代碼所示),也可以記錄事件或執(zhí)行某個(gè)其他操作。
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(); //同樣要注意這句代碼的使用
}
備注:此示例在瀏覽器中顯示詳細(xì)的錯(cuò)誤信息,提供此示例只是為了進(jìn)行說(shuō)明。向應(yīng)用程序的最終用戶(hù)顯示詳細(xì)信息一定要小心。更適當(dāng)?shù)淖龇ㄊ窍蛴脩?hù)顯示一條消息,告知已發(fā)生錯(cuò)誤,然后將具體的錯(cuò)誤詳細(xì)信息記錄在日志中。
2.ErrorPage屬性
你幾乎可以在頁(yè)面任何時(shí)候設(shè)置ErrorPage屬性,從而確定頁(yè)面發(fā)生錯(cuò)誤的時(shí)候會(huì)重定向至哪個(gè)頁(yè)面。要讓ErrorPage屬性能夠發(fā)揮作用,<customErrors>配置項(xiàng)中的mode屬性必須設(shè)為"On"。
this.ErrorPage = "~/ErrorHandling/PageError.html";
如果Page_Error和ErrorPage都存在,當(dāng)拋出Exception時(shí),頁(yè)面執(zhí)行順序是怎樣的呢?頁(yè)面會(huì)先執(zhí)行Page_Error事件處理函數(shù),如果Page_Error()事件中調(diào)用函數(shù)Server.ClearError()清除異常信息,則不會(huì)跳轉(zhuǎn)到ErrorPage屬性指定頁(yè)面;如果沒(méi)有調(diào)用Server.ClearError(),Exception信息會(huì)繼續(xù)向上拋,頁(yè)面會(huì)跳轉(zhuǎn)到ErrorPage指定頁(yè)面。這也就證明了優(yōu)先級(jí)順序:Page_Error事件>ErrorPage屬性。
3.Application_Error事件
與Page_Error 事件相類(lèi)似,您可使用Application_Error事件捕獲發(fā)生在應(yīng)用程序中的錯(cuò)誤。由于事件發(fā)生在整個(gè)應(yīng)用程序范圍內(nèi),因此您可記錄應(yīng)用程序的錯(cuò)誤信息或處理其他可能發(fā)生的應(yīng)用程序級(jí)別的錯(cuò)誤。在Global.asax文件中添加如下代碼就OK了。
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError().GetBaseException();
//實(shí)際應(yīng)用中這里可以將Exception信息記Log或是保存到數(shù)據(jù)庫(kù)中
//還可以將錯(cuò)誤發(fā)郵件給網(wǎng)站維護(hù)人員
Response.Write("Error:" + ex.Message);
//清除Exception,避免繼續(xù)傳遞給上一級(jí)處理
//這里上級(jí)就是<CustomerErrors>配置節(jié)了
Server.ClearError();
}
4.<customErrors>配置項(xiàng)ITPUB個(gè)人空間'u#v Ts BKKt
配置文件web.config中的<customErrors> 配置節(jié),可將重定向頁(yè)指定為默認(rèn)的錯(cuò)誤頁(yè)defaultRedirect或者根據(jù)引發(fā)的 HTTP 錯(cuò)誤代碼指定特定頁(yè)。如果發(fā)生在應(yīng)用程序以前的任一級(jí)別都未捕獲到的錯(cuò)誤,則顯示這個(gè)自定義頁(yè)。
<customErrors mode="On" defaultRedirect="~/ErrorHandling/ApplicationError.html"> <error statusCode="404" redirect="~/ErrorHandling/404.html" /> </customErrors>
同樣,如果Application_Error和<customerErrors>同時(shí)存在,也存在執(zhí)行順序的問(wèn)題。因?yàn)閮?yōu)先級(jí)Application_Error事件> <customErrors>配置項(xiàng),所以發(fā)生應(yīng)用程序級(jí)錯(cuò)誤時(shí),優(yōu)先執(zhí)行Application_Error事件中的代碼,如果Application_Error事件中調(diào)用了Server.ClearError()函數(shù),<customerErrors>配置節(jié)中的defaultRedirect不起作用,因?yàn)镋xception已經(jīng)被清除;如果Application_Error事件中沒(méi)用調(diào)用了Server.ClearError()函數(shù),錯(cuò)誤頁(yè)會(huì)重新定位到defaultRedict指定的URL頁(yè)面,為用戶(hù)顯示友好出錯(cuò)信息。
通過(guò)對(duì).NET提供的以上四種錯(cuò)誤處理機(jī)制的分析,我們可以把它們從不同的角度分類(lèi),便于我們理解和使用。ITPUB個(gè)人空間4M|zF!L1k
1.從功能上分類(lèi):用于異常處理(Handling exceptions)是Page_Error事件和Application_Error事件;用戶(hù)錯(cuò)誤頁(yè)面重定向(Redirecting the user to an error page)的是 ErrorPage屬性 和 <customErrors>配置項(xiàng)。
2.從錯(cuò)誤處理的范圍分類(lèi):用于頁(yè)面級(jí)(Page level)錯(cuò)誤處理的是Page_Error事件 和 ErrorPage屬性;用于應(yīng)用程序級(jí)(Application level)錯(cuò)誤處理的是Application_Error事件 和 <customErrors>配置項(xiàng)。