ASP.NET中的異常處理:

來源:互聯網
上載者:User
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();
}
}

希望上述解釋能夠給您一些協助。

Jasson Wang
線上支援人員工程師
微軟全球支援人員中心

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.