DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> ASP.NET中的異常處理
ASP.NET中的異常處理
編輯:AJAX詳解     
ASP.Net中的異常處理: 
當一個異常在調用堆棧中沒有被處理,也沒有被框架代碼處理時,我們說這個異常未處理,它將被ASP.NET捕獲,ASP.Net對此未處理錯誤的處理方法是顯示一個頁面,列出該未處理異常的詳細情況。 
有兩個在異常未處理時將被ASP.Net調用的事件: 
Page_Error event,它提供捕獲在Page級別發生錯誤的方法。 
Application_Error event,它提供捕獲在代碼中的任何地方發生錯誤的方法。該事件的范圍是整個應用程序,這使它成為添加日志代碼的一個理想地方。 
這兩個事件的執行順序是——先執行Page_Error,後執行Application_Error。如果希望在Page_Error中處理過的錯誤就不要再在Application_Error中處理,我們可以在Page_Error中處理錯誤之後,使用Server.ClearError方法清除最後一個錯誤,避免再調用Application_Error。 

ASP.Net AJax UpdatePanel的異常處理: 
您可以使用Reflector反編譯UpdatePanel控件可以查看其實現代碼發現,放在UpdatePanel控件上的異常已經在RequestManager類的OnPageError中已經處理掉了,所以您在Application_Error無法捕獲UpdatePanel中的錯誤做進一步的處理,詳細的解釋如下: 
UpdatePanel控件的RenderChildren(HtmlTextWriter):Void方法 
protected override void RenderChildren(HtmlTextWriter writer) 

if (this._asyncPostBackMode) 

if (this._rendered) 

return; 

HtmlTextWriter writer2 = new HtmlTextWriter(new StringWriter(CultureInfo.CurrentCulture)); 
base.RenderChildren(writer2); 
PageRequestManager.EncodeString(writer, "updatePanel", this.ClIEntID, writer2.InnerWriter.ToString()); 

else 

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClIEntID); 
if (this.RenderMode == UpdatePanelRenderMode.Block) 

writer.RenderBeginTag(HtmlTextWriterTag.Div); 

else 

writer.RenderBeginTag(HtmlTextWriterTag.Span); 

base.RenderChildren(writer); 
writer.RenderEndTag(); 

this._rendered = true; 

從這個方法中您可以看到在AJax異步處理中調用了PageRequestManager.EncodeString(writer, "updatePanel", this.ClIEntID, writer2.InnerWriter.ToString());方法,接著查找PageRequestManager類,您可以發現該類中有OnPageError(object sender,EventArgs e)事件處理器,並且在PageRequestManager類的OnInit初始化事件處理器中登記了OnPageError的事件處理器,從這裡可以看出當UpdatePanel上的控件發生異常時,UpdatePanel本身將會把它處理掉,您在Application_Error也就無法捕獲到了。 
PageRequestManager類的OnInit方法: 
internal void OnInit() 

if (this._owner.EnablePartialRendering && !this._owner._supportsPartialRenderingSetByUser) 

IHttpBrowserCapabilitIEs browser = this._owner.IPage.Request.Browser; 
bool flag = ((browser.W3CDomVersion >= MinimumW3CDomVersion) && (browser.EcmaScriptVersion >= MinimumEcmaScriptVersion)) && browser.SupportsCallback; 
if (flag) 

flag = !this.EnableLegacyRendering; 

this._owner.SupportsPartialRendering = flag; 

if (this._owner.IsInAsyncPostBack) 

this._owner.IPage.Error += new EventHandler(this.OnPageError); 


PageRequestManager類的OnPageError方法: 
private void OnPageError(object sender, EventArgs e) 

Exception lastError = this._owner.IPage.Server.GetLastError(); 
this._owner.OnAsyncPostBackError(new AsyncPostBackErrorEventArgs(lastError)); 
string asyncPostBackErrorMessage = this._owner.AsyncPostBackErrorMessage; 
if (string.IsNullOrEmpty(asyncPostBackErrorMessage) && !this._owner.Control.Context.IsCustomErrorEnabled) 

asyncPostBackErrorMessage = lastError.Message; 

int httpCode = GetHttpCodeForException(lastError); 
bool flag = false; 
if (this._owner.AllowCustomErrorsRedirect && this._owner.Control.Context.IsCustomErrorEnabled) 

if (!this.CustomErrorsSectionHasRedirect(httpCode)) 

flag = true; 


else 

flag = true; 

if (flag) 

this._owner.IPage.Response.Clear(); 
EncodeString(this._owner.IPage.Response.Output, "error", httpCode.ToString(CultureInfo.InvariantCulture), asyncPostBackErrorMessage); 
this._owner.IPage.Response.End(); 



希望上述解釋能夠給您一些幫助。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved