最近在公司某管理系統中,用了一些獨立的模組,在這些類的實現中,錯誤是直接拋出異常的,我想這是我們通常的做法。然而,問題也來了,由於自己在Asp.net頁面中沒有去捕獲這些異常,並且多處頁面中都使用了這些類,於是在多個頁面都會出現不友好的錯誤提示資訊。
怎麼辦?又不想一處一處修改代碼,既費時又費力,這樣編程不就變成了體力勞動,從而失去了樂趣。 這時讓我想起了自訂錯誤頁,於是Google,終於找到了答案。
1、配置web.config:
<customErrors mode="RemoteOnly" defaultRedirect="ErrorPage.aspx" redirectMode="ResponseRewrite"/>
關鍵是redirectMode屬性,該屬性預設為ResponseRedirect,由於被Redirect了,異常也就被忽略了,使你無法捕獲到異常。這裡羅嗦一句:因為出錯前後被認為是兩次請求,我們知道http協議是一種無狀態的協議,第二次請求忽略了第一次的異常也就不奇怪了。於是有人用了Session或Application來儲存異常,這是不可取的。正確的做法是使用“ResponseRewrite"。
2、輸出異常資訊:
我們知道網站出錯時,會自動導向我們的ErrorPage.apx頁面,在ErrorPage.aspx中如何訪問這個異常呢?答案是:Server.GetLastError(),當然有可能是Server.GetLastError().InnerException。這要具體分析了。
if(Server.GetLastError()!=null){
Response.Write(Server.GetLastError().Message);
}
順便說一下:
Asp.net MVC中就簡單多了,架構內建了一個Error.aspx,異常儲存在Model.Exception中,並且Web.config中也為我們配置好了。
在下從去年以來開發的網頁就基本是MVC的了,結構清晰,擴充方便,清涼的HTML代碼輸出。有空看看MVC的原始碼還是很有協助的。