概述ASP.NET錯誤處理
要創(chuàng)建頁中的全局處理程序,請創(chuàng)建 Page_Error 事件的處理程序。要創(chuàng)建ASP.NET應用程序范圍的錯誤處理程序,請在 Global.asax 文件中將代碼添加到 Application_Error 方法。只要您的頁或應用程序中發(fā)生未處理的異常,就會調用這些方法。您可以從 HttpServerUtility.GetLastError 方法獲取有關最新錯誤的信息。
注意 如果您具有全局錯誤處理程序,則它優(yōu)先于在 Web.config customErrors 元素的 defaultRedirect 屬性中指定的ASP.NET錯誤處理。
原則(MSDN):在您的應用程序顯示錯誤信息時,它不應該泄露有助于惡意用戶攻擊您系統(tǒng)的信息。例如,如果您的應用程序試圖登錄數(shù)據(jù)庫時沒有成功,則顯示的錯誤信息不應該包括它正在使用的用戶名。
有許多方法可以控制錯誤信息:
將應用程序配置為不向遠程(應用程序)用戶顯示詳細錯誤信息。您也可以選擇將錯誤重定向到應用程序頁。
只要可行就包括ASP.NET錯誤處理,并編寫您自己的錯誤信息。在您的錯誤處理程序中,您可以進行測試以確定用戶是否為本地用戶并作出相應的響應。
在捕捉所有未處理異常并將它們發(fā)送到一般錯誤頁的頁級別或應用程序級別上,創(chuàng)建全局錯誤處理程序。這樣,即使您沒有預料到某個問題,至少用戶不會看到異常頁。
一.頁面級的ASP.NET錯誤處理
- voidPage_Error(Objectsender,EventArgse){
- Stringmessage="<fontface=verdanacolor=red>"
- +"<h4>"+Request.Url.ToString()+"</h4>"
- +"<pre><fontcolorfontcolor='red'>"+Server.GetLastError().ToString()+"</pre>"
- +"</font>";
- Response.Write(message);
- Server.ClearError();
- }
注:通過使用 Server 對象訪問來自服務器的錯誤信息。特別地,該示例從 Request 對象獲取請求的 URL,以及 Server 對象的最新錯誤(使用 GetLastError 方法),并將這兩者都轉換為客戶端可以顯示的字符串。將 message 變量寫入客戶端后,通過使用 ClearError 方法刪除該錯誤
二.應用程序級的錯誤事件中
錯誤處理方式如下:global.asax文件中的application_error中添加處理 邏輯,可添加其它操作,如寫入windows事件日志,發(fā)郵件給管理員,將錯誤信息寫入數(shù)據(jù)庫。具體如下:
- protectedvoidApplication_Error(Objectsender,EventArgse)
- {
- StringMessage="\n\nURL:\nhttp://localhost/"+Request.Path
- +"\n\nMESSAGE:\n"+Server.GetLastError().Message
- +"\n\nSTACKTRACE:\n"+Server.GetLastError().StackTrace;
- //寫入windows事件日志
- StringLogName="Application";
- if(!EventLog.SourceExists(LogName))
- {
- EventLog.CreateEventSource(LogName,LogName);
- }
- EventLogLog=newEventLog();
- Log.Source=LogName;
- Log.WriteEntry(Message,EventLogEntryType.Error);
- }
三.web.config中,自定義錯誤信息。將應用程序配置為不向遠程用戶顯示錯誤
- <customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx">
- <error statusCode="404" redirect="NoSuchPage.aspx"/>
- <error statusCode="403" redirect="NoAccessAllowed.aspx"/>
- </customErrors>
注:將 mode 屬性設置為 RemoteOnly(區(qū)分大小寫)。這就將應用程序配置為僅向本地用戶(您和開發(fā)人員)顯示詳細的錯誤。
(可選)包括指向應用程序錯誤頁的 defaultRedirect 屬性。
(可選)包括將錯誤重定向到特定頁的 error 元素。例如,您可以將標準 404 錯誤(未找到頁)重定向到您自己的應用程序頁。
四.包括ASP.NET錯誤處理 (MSDN)
1.在可能產生錯誤的任何語句前后使用 try-catch-finally 塊。
2.(可選)使用 Context 對象的 UserHostAddress 屬性對本地用戶進行測試并相應地修改錯誤處理。值 127.0.0.1 等效于“l(fā)ocalhost”并指示瀏覽器與 Web 服務器位于同一臺計算機上。
下面顯示的是一個示例錯誤處理塊。如果發(fā)生錯誤,則用有關消息的詳細信息加載 Session 狀態(tài)變量,然后應用程序顯示可以讀取 Session 變量并顯示錯誤的頁。(有意寫入此錯誤以便不向用戶提供任何可利用的詳細信息。)如果用戶是本地用戶,則提供不同的錯誤詳細信息。在 finally 塊中,釋放開放式資源。
- try
- {
- sqlConnection1.Open();
- sqlDataAdapter1.Fill(dsCustomers1);
- }
- catch (Exception ex)
- {
- if(HttpContext.Current.Request.UserHostAddress == "127.0.0.1")
- { Session["CurrentError"] = ex.Message; }
- else
- { Session["CurrentError"] = "Error processing page."; }
- Server.Transfer("ApplicationError.aspx");
- }
- finally
- {
- this.sqlConnection1.Close();
- }
【編輯推薦】