ASP
NET應用可以再代碼中利用異常捕獲來處理錯誤(try
catch)但是應用出現的所有錯誤
都用異常捕獲來處理是一種不良的編程習慣
try
catch使用簡單
但是過度使用會導致嚴重的性能損失
如果能檢測可能出現不預期情況
應該盡量使用其他方法
而將異常捕獲作為最後考慮的手段
異常捕獲是NET官方提供應用程序處理工具
如果ASP
NET應用程序出現異常
運行時會試圖尋找有意捕獲它的代碼塊
異常會在棧中下上遍歷
直到抵達當前應用程序的起始層
如果在這期間沒有找到合適的處理程序
該異常便成為未處理異常
並使CLR拋出系統異常
用戶會看見報黃頁
應用程序也會隨即終止
默認的錯誤頁面用戶在本地和遠程計算機看到的典型錯誤頁面是不一樣的
本地用戶會看到相對詳細的錯誤信息
遠程用戶接收到的信息不會那麼詳細
主要是出於安全方面考慮
ASP
NET提供了兩級全局攔截點
分別位於頁面級和應用程序級
幫助我們以編程的方法處理錯誤
基於基類Page暴露了Error事件
我們可以在頁面中重寫它
捕獲頁面執行期間引發的未處理異常
同樣
HttpApplication類中也有Error事件
用於捕獲整個應用程序中拋出的異常
頁面級錯誤處理
protected override void OnError(EventArgs e)
{
Exception ex = Server
GetLastError()
if(ex is NotImplementedException)
Server
Transfer(
errorpages/notImplemented
aspx
)
else
Server
Transfer(
errorpages/apperror
aspx
)
Server
ClearError()
}
通過Server對象的GetLastError方法
我們獲得被引發的異常
然後傳到特定的頁面
展示給用戶
最後一旦異常處理完成
應用調用ClearError清楚錯誤
全局錯誤處理
頁面的Error事件處理能夠捕獲特定頁面的錯誤
如果要使組合應用程序的所有頁面共享一套錯誤處理代碼
我們可以在應用程序級創建一段全局錯誤處理程序
便可捕獲所有未處理異常
實現幾乎和頁面級的錯誤處理程序一樣
只不過處理的是代表整個應用程序的HttpApplication對象中的Error事件
為此
我們需要將global
asax文件添加到程序中
並定義Application_Error方法
protected override void OnError(EventArgs e)
{
Exception ex = Server
GetLastError()
if(ex is NotImplementedException)
Server
Transfer(
errorpages/notImplemented
aspx
)
else
Server
Transfer(
errorpages/apperror
aspx
)
Server
ClearError()
}
錯誤的頁面映射
當未處理異常抵達調用棧末端時
ASP
NET會報黃頁
但是我們還可以通過使用應用程序Web
Config文件中的<customErrors>區段
可以對這個功能進行充分的控制
<configuration>
<system
web>
<customErrors mode=
Off
>
</customErrors>
</system
web>
</configuration>
mode屬性用於決定錯誤消息是啟動
關閉還是只顯示給遠程客戶端
當mode設為RemoteOnly時
遠程用戶會收到一般性的錯誤提示頁面
而本地可以得到詳細的錯誤信息
當mode設為off時
本地和遠程用戶都會顯示包含詳細錯誤的頁面
可以自定義錯誤頁面
<configuration>
<system
web>
<customErrors mode=
Off
defaultRedirect=
>
</customErrors>
</system
web>
</configuration>
如果mode為on時
本地和遠程都將會把defaultRedirect=
頁面來代替原來的錯誤報黃頁面
為用戶展示友好的錯誤提示
大多數自定義的錯誤頁面時純HTML編寫的
常見的HTTP錯誤處理
ASP
NET還使我們能夠針對發生的不同HTTP錯誤顯示相應的自定義頁面
錯誤頁面和特定HTTP狀態之間的映射
可以定義在<customErrors>區段
設置<error>標簽
將HTTP狀態碼
和自定義錯誤頁面關聯起來
<configuration>
<system
web>
<customErrors mode=
Off
defaultRedirect=
>
<error statusCode=
redirect=
/>
<error statusCode=
redirect=
/>
</customErrors>
</system
web>
</configuration>
From:http://tw.wingwit.com/Article/program/net/201311/13824.html