ASPNET 提供三種用於在出現錯誤時捕獲和響應錯誤的主要方法Page_Error 事件Application_Error 事件以及應用程序配置文件 (nfig)
如果您不調用 ServerClearError 或者捕獲 Page_Error 或 Application_Error 事件中的錯誤則將根據 nfig 文件的 <customErrors> 部分中的設置處理錯誤在 <customErrors> 部分可將重定向頁指定為默認的錯誤頁 (defaultRedirect) 或者根據引發的 HTTP 錯誤代碼指定特定頁您可使用此方法自定義用戶收到的錯誤信息
盡管您可在 <customErrors> 部分中 defaultRedirect 屬性的值中引用默認的錯誤頁但是您還可根據引發的 HTTP 錯誤代碼指定要重定向到的特定頁<error> 子元素允許使用此選項<customErrors mode=On defaultRedirect=ApplicationErroyaspx> <error statusCode= redirect=/> <error statusCode= redirect=/> <error statusCode= redirect=/> </customErrors>
自定義錯誤處理頁面方法一添加nfig < systemweb>< /systemweb>中添加< customErrors mode=On defaultRedirect=ApplicationErroyaspx >< /customErrors>節點添加錯誤處理頁面ApplicationErroyaspx調用下面的方法private void DealErroy()
{ HttpException erroy = new HttpException()string strCode = erroyErrorCodeToString()string strMsg = erroyMessageerroyHelpLink = sssResponseWrite(ErrorCode + strCode + < br>)ResponseWrite(Message + strMsg + < br>)ResponseWrite(HelpLink + erroyHelpLink + < br>)ResponseWrite(Source + erroySource + < br>)ResponseWrite(TargetSite + erroyTargetSite + < br>)ResponseWrite(InnerException + erroyInnerException + < br>)ResponseWrite(StackTrace + erroyStackTrace + < br>)ResponseWrite(GetHtmlErrorMessage + erroyGetHtmlErrorMessage() + < br>)ResponseWrite(erroyGetHttpCode()ToString() + erroyGetHttpCode()ToString() + < br>)ResponseWrite(erroyDataToString() + erroyDataToString() + < br>)}
private void DealErroy()
{ HttpException erroy = new HttpException()string strCode = erroyErrorCodeToString()string strMsg = erroyMessageerroyHelpLink = sssResponseWrite(ErrorCode + strCode + < br>)ResponseWrite(Message + strMsg + < br>)ResponseWrite(HelpLink + erroyHelpLink + < br>)ResponseWrite(Source + erroySource + < br>)ResponseWrite(TargetSite + erroyTargetSite + < br>)ResponseWrite(InnerException + erroyInnerException + < br>)ResponseWrite(StackTrace + erroyStackTrace + < br>)ResponseWrite(GetHtmlErrorMessage + erroyGetHtmlErrorMessage() + < br>)ResponseWrite(erroyGetHttpCode()ToString() + erroyGetHttpCode()ToString() + < br>)ResponseWrite(erroyDataToString() + erroyDataToString() + < br>)}
這種方法不能完整地顯示錯誤信息
自定義錯誤處理頁面方法二添加nfig < systemweb>< /systemweb>中添加< customErrors mode=On defaultRedirect=ApplicationErroyaspx >< /customErrors>節點添加Globalasax文件找到Application_Error事件加入以下代碼://這是添加了一個全局應用程序類 在Application_Error事件中處理錯誤頁面 和nfig沒有關系 即使沒有nfig 也是可以定位到錯誤頁面void Application_Error(object sender EventArgs e)
{ //在出現未處理的錯誤時運行的代碼Exception erroy = ServerGetLastError()string err = 出錯頁面是 + RequestUrlToString() + </br>err += 異常信息 + erroyMessage + </br>err += Source + erroySource + </br>err += StackTrace + erroyStackTrace + </br>//清除前一個異常ServerClearError()
//此處理用Session[ProError]出錯所以用 Application[ProError] Application[erroy] = err//此處不是page中不能用ResponseRedirect(……/frmSysErroraspx)SystemWebHttpContextCurrentResponseRedirect(HttpContextCurrentRequestApplicationPath + /ApplicationErroyaspx)
} 添加錯誤處理頁面ApplicationErroyaspx 加入以下代碼protected void Page_Load(object sender EventArgs e)
{ //顯示程序中的錯誤碼if (!IsPostBack)
{ //顯示程序中的錯誤碼if (Application[erroy] != null)
{ ResponseWrite(Application[erroy]ToString())}這種方法能完整地顯示錯誤信息最好的辦法還是兩種方法一起用最好!
另nfig中也可以把<customErrors mode=On defaultRedirect=ApplicationErroyaspx> <error statusCode= redirect=/> <error statusCode= redirect=/> <error statusCode= redirect=/> </customErrors>
添加進去http錯誤代碼含義 Forbidden Not Found Internal Server Error http錯誤代碼含義大全詳解 htmdoshowoneuidtypeblol
方法三Page_Error事件Page_Error 事件提供一種捕獲在頁級別出現的錯誤的方法您可以只是顯示錯誤信息(正如下面的示例代碼所示)也可以記錄事件或執行某個其他操作
備注此示例在浏覽器中顯示詳細的錯誤信息提供此示例只是為了進行說明向應用程序的最終用戶顯示詳細信息(尤其是該應用程序在 Internet 上運行時)一定要小心更適當的做法是向用戶顯示一條消息告知已發生錯誤然後將具體的錯誤詳細信息記錄在事件日志中
本示例引發一個強迫錯誤發生在 Page_Load 事件中的空異常按照以下步驟可創建將測試 Page_Error 事件的初始頁 按照以下步驟將名為 PageEventaspx 的新文件添加到項目中 a 打開 Microsoft Visual Studio NET b 在解決方案資源管理器中右鍵單擊該項目節點指向添加然後單擊添加 Web 窗體
c 在名稱文本框中鍵入 PageEventaspx然後單擊打開
將以下代碼添加到 PageEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)
{ throw(new ArgumentNullException())} public void Page_Error(object senderEventArgs e)
{ Exception objErr = ServerGetLastError()GetBaseException()string err = <b>Error Caught in Page_Error event</b><hr><br> + <br><b>Error in</b> + RequestUrlToString() + <br><b>Error Message</b> + objErrMessageToString()+ <br><b>Stack Trace</b><br> + objErrStackTraceToString()ResponseWrite(errToString())ServerClearError()} </script>從文件菜單中單擊保存 PageEventaspx右鍵單擊該頁然後單擊在浏覽器中查看以運行該頁請注意將按照代碼規范引發和報告錯誤
備注您可能注意到代碼發出對 ServerClearError 的調用這將防止錯誤繼續到要被處理的 Application_Error 事件中
此外您還應記下 @ Page 指令中的 Inherits 屬性如果已經設置 Inherits則必須首先生成項目然後再浏覽到該頁如果不首先生成項目將看到下面的錯誤信息 ProjectPageEvent is not a valid type(轉)
ASPNET 在處理和響應錯誤的方式上進行了若干改進在傳統的 ASP 中是用On Error Resume Next(或在 Jscript 中用 trycatch 塊)處理錯誤的或者如果您運行的是 Microsoft Internet Information Services (IIS) 則使用 ASPError 對象創建自定義的錯誤報告頁然而這些方法都有其局限性
ASPNET 提供了在運行 ASPNET 應用程序時可能出現的錯誤的若干處理和響應級別ASPNET 提供三種用於在出現錯誤時捕獲和響應錯誤的主要方法Page_Error 事件Application_Error 事件以及應用程序配置文件 (nfig)
本文演示如何在 ASPNET 應用程序中使用這些新功能盡管本文由於與 ASPNET 直接相關而介紹了如何提供自定義錯誤頁和一般錯誤報告但是它並不介紹其他錯誤處理方法如 trycatchfinally 塊和公共語言運行庫 (CLR) 異常系統
如何使用 Page_Error 事件Page_Error 事件提供一種捕獲在頁級別出現的錯誤的方法您可以只是顯示錯誤信息(正如下面的示例代碼所示)也可以記錄事件或執行某個其他操作
備注此示例在浏覽器中顯示詳細的錯誤信息提供此示例只是為了進行說明向應用程序的最終用戶顯示詳細信息(尤其是該應用程序在 Internet 上運行時)一定要小心更適當的做法是向用戶顯示一條消息告知已發生錯誤然後將具體的錯誤詳細信息記錄在事件日志中
本示例引發一個強迫錯誤發生在 Page_Load 事件中的空異常按照以下步驟可創建將測試 Page_Error 事件的初始頁 按照以下步驟將名為 PageEventaspx 的新文件添加到項目中 a 打開 Microsoft Visual Studio NET b 在解決方案資源管理器中右鍵單擊該項目節點指向添加然後單擊添加 Web 窗體
c 在名稱文本框中鍵入 PageEventaspx然後單擊打開
將以下代碼添加到 PageEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)
{ throw(new ArgumentNullException())} public void Page_Error(object senderEventArgs e)
{ Exception objErr = ServerGetLastError()GetBaseException()string err = <b>Error Caught in Page_Error event</b><hr><br> + <br><b>Error in</b> + RequestUrlToString() + <br><b>Error Message</b> + objErrMessageToString()+ <br><b>Stack Trace</b><br> + objErrStackTraceToString()ResponseWrite(errToString())ServerClearError()} </script> 從文件菜單中單擊保存 PageEventaspx 右鍵單擊該頁然後單擊在浏覽器中查看以運行該頁請注意將按照代碼規范引發和報告錯誤
備注您可能注意到代碼發出對 ServerClearError 的調用這將防止錯誤繼續到要被處理的 Application_Error 事件中
此外您還應記下 @ Page 指令中的 Inherits 屬性如果已經設置 Inherits則必須首先生成項目然後再浏覽到該頁如果不首先生成項目將看到下面的錯誤信息 ProjectPageEvent is not a valid type如何使用 Application_Error 事件與 Page_Error 事件相類似您可使用 Application_Error 事件捕獲發生在應用程序中的錯誤由於事件發生在整個應用程序范圍內因此您可記錄應用程序的錯誤信息或處理其他可能發生的應用程序級別的錯誤
下面的示例基於前面的 Page_Error 事件代碼示例如果 Page_Load 事件中的錯誤未在 Page_Error 事件中捕獲將引發異常Application_Error 事件在應用程序的 Globalasax 文件中進行指定為簡單起見本節中的步驟創建一個要在其中引發異常的新頁捕獲 Globalasax 文件的 Application_Error 事件中的錯誤並將該錯誤寫入事件日志中下面的步驟演示如何使用 Application_Error 事件 將名為 AppEventaspx 的新文件添加到項目中 將以下代碼添加到 AppEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)
{ throw(new ArgumentNullException())} </script> 從文件菜單中單擊保存 AppEventaspx 將 Application_Error 事件添加到 Globalasax 文件中以捕獲在 AppEventaspx 頁的 Page_Load 事件中引發的錯誤注意您必須為 SystemDiagnostics 名稱空間將另一條 using 語句添加到 Globalasax才能使用事件日志
將以下代碼添加到 Globalasax 文件中using SystemDiagnosticsprotected void Application_Error(object sender EventArgs e)
{ Exception objErr = ServerGetLastError()GetBaseException()string err = Error Caught in Application_Error event\n + Error in + RequestUrlToString() + \nError Message+ objErrMessageToString() + \nStack Trace+ objErrStackTraceToString()EventLogWriteEntry(Sample_WebApperrEventLogEntryTypeError)ServerClearError()//additional actions……
} 保存 Globalasax 文件
在 Visual Studio NET 中在生成菜單上單擊生成
右鍵單擊該頁然後單擊在浏覽器中查看在這種情況下該頁將為空白但是您應該注意到在事件日志中已添加了一個新項本示例在應用程序日志中生成一個項 可從事件查看器訪問應用程序日志在記錄錯誤之後您可能希望將用戶重定向到另一個更用戶友好的錯誤頁或者根據需要執行一些其他操作
如何使用 nfig 文件如果您不調用 ServerClearError 或者捕獲 Page_Error 或 Application_Error 事件中的錯誤則將根據 nfig 文件的 <customErrors> 部分中的設置處理錯誤在 <customErrors> 部分可將重定向頁指定為默認的錯誤頁 (defaultRedirect) 或者根據引發的 HTTP 錯誤代碼指定特定頁您可使用此方法自定義用戶收到的錯誤信息
如果發生在應用程序以前的任一級別都未捕獲到的錯誤則顯示這個自定義頁本節演示如何修改 Globalasax 文件以便從不調用 ServerClearError因此錯誤在作為捕獲錯誤的最後一點的 nfig 文件中進行處理 從上一個示例中打開 Globalasax 文件
將 ServerClearError 行注釋掉以便確保錯誤出現在 nfig 文件中
將所作更改保存到 Globalasax 中代碼看起來應類似如下形式using SystemDiagnosticsprotected void Application_Error(object sender EventArgs e)
{ Exception objErr = ServerGetLastError()GetBaseException()string err = Error Caught in Application_Error event\n + Error in + RequestUrlToString() + \nError Message+ objErrMessageToString() + \nStack Trace+ objErrStackTraceToString()EventLogWriteEntry(Sample_WebApperrEventLogEntryTypeError)//ServerClearError()//additional actions……
} 將以下代碼添加到 <customErrors> 部分以便將用戶重定向到自定義頁<customErrors defaultRedirect= mode=On> </customErrors>備注必須修改 defaultRedirect 屬性中的文件路徑以便它引用相關的 Web 服務器和應用程序名稱
因為在此級別捕獲的錯誤會發送到默認的錯誤頁所以必須創建一個名為 的錯誤頁請記住您要使用此方法來控制向用戶呈現的內容因此本示例使用 頁作為錯誤頁將以下代碼添加到 中<HTML> <HEAD> <TITLE></TITLE> <META NAME=GENERATOR Content=Microsoft Visual Studio > </HEAD> <BODY> <b>Custom Error page!</b> <br> You have been redirected here from the <customErrors> section of the nfig file </BODY> </HTML> 若要測試該代碼請保存這些文件生成項目然後在浏覽器中查看 AppEventaspx請注意在引發錯誤時您將被重定向到 頁
盡管您可在 <customErrors> 部分中 defaultRedirect 屬性的值中引用默認的錯誤頁但是您還可根據引發的 HTTP 錯誤代碼指定要重定向到的特定頁<error> 子元素允許使用此選項例如<customErrors defaultRedirect= mode=On> <error statusCode= redirect= /> </customErrors>備 注在 <customErrors> 部分的 defaultRedirect 中指定的頁是一個 文件如果您打算在 aspx 頁中使用 GetLastError (正如 Page_Error 和 Application_Error 示例那樣)則在進行重定向之前必須將異常存儲在會話變量或某個其他方法中
請注意<customErrors> 部分包括設置為 On 的 mode 屬性mode 屬性用於控制錯誤重定向發生的方式例如如果您正開發應用程序則很可能希望查看實際的 ASPNET 錯誤信息並且不希望被重定向到更用戶友好的錯誤頁mode 屬性包括以下設置 ? On未被處理的異常將用戶重定向到指定的 defaultRedirect 頁此模式主要用於生產? Off用戶收到異常信息而不是被重定向到 defaultRedirect 頁此模式主要用於開發? RemoteOnly只有在本地計算機上訪問該站點的用戶(通過使用 localhost)才能收到異常信息所有其他用戶都被重定向到 defaultRedirect 頁此模式主要用於調試
From:http://tw.wingwit.com/Article/program/net/201311/11901.html