- 決戰(zhàn).NET
- 黃忠成
- 995字
- 2018-12-27 16:55:58
3.7 Async-Postback的錯(cuò)誤控管
當(dāng)Async-Postback的要求到達(dá)Server時(shí),若處理期間發(fā)生任何的異常,ScriptManager控件會(huì)觸發(fā)AsyncPostbackError事件,如果設(shè)計(jì)師未掛載任何事件的話,ScriptManager控件便會(huì)輸出AsyncPostbackErrorMessage屬性所設(shè)定的信息,此時(shí)瀏覽器便會(huì)以信息窗方式顯示此錯(cuò)誤信息,若AsyncPostbackErrorMessage屬性值為空白,ScriptManager控件會(huì)直接輸出異常的錯(cuò)誤信息。我承認(rèn),這段說(shuō)明對(duì)讀者來(lái)說(shuō)有些模糊,文教不如身教,請(qǐng)照以下的步驟來(lái)創(chuàng)建一個(gè)網(wǎng)頁(yè)。
1. 創(chuàng)建一個(gè)新網(wǎng)頁(yè),命名為ErrorCatchs.aspx。
2. 在頁(yè)面中放入一個(gè)ScriptManager控件。
3. 在頁(yè)面中放入一個(gè)UpdatePanel控件。
4. 將UpdatePanel1控件的UpdateMode設(shè)為Conditional。
5. 在UpdatePanel控件中放入一個(gè)Button控件,將Text屬性設(shè)為Catch Me。
6. 在Button控件的Click事件中鍵入程序3-13的代碼。
程序3-13
Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs protected void Button1_Click(object sender, EventArgs e) { throw new Exception("Error in Catch Me !!"); }
完成并運(yùn)行此程序,點(diǎn)擊Button后便可看到瀏覽器彈出報(bào)錯(cuò)信息,而此報(bào)錯(cuò)信息便是Click事件所拋出的異常信息,如圖3-11所示。

圖3-11
這就是ScriptManager控件最基本的錯(cuò)誤控管機(jī)制,當(dāng)然!這對(duì)實(shí)務(wù)上來(lái)說(shuō)仍嫌過(guò)于初級(jí),應(yīng)該更明確地指出此錯(cuò)誤信息是在Async-Postback時(shí)發(fā)生的。請(qǐng)照以下的步驟,一步步地修改此例子。
1. 掛載事件至ScriptManager的AsyncPostbackError事件。
2. 鍵入程序程序3-14的代碼。
程序3-14
Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs protected void ScriptManager1_AsyncPostbackError(object sender, AsyncPostbackErrorEventArgs e) { ScriptManager1.AsyncPostbackErrorMessage = string.Format("異步回傳錯(cuò)誤:{0}", e.Exception.Message); }
重新運(yùn)行程序后,便可看到更明顯的錯(cuò)誤信息,指出此錯(cuò)誤是發(fā)生于異步機(jī)制,如圖3-12 所示。

圖3-12
這些就是AsyncPostbackErrorMessage及AsyncPostbackError事件的用法,這個(gè)顯示錯(cuò)誤的形式會(huì)受到ScriptManager的AllowCustomErrorsRedirect屬性值的影響,當(dāng)此值為Ture時(shí),若web.config中明確設(shè)定了錯(cuò)誤的頁(yè)面時(shí),ScriptManager就會(huì)在錯(cuò)誤發(fā)生時(shí),自動(dòng)轉(zhuǎn)向至該頁(yè)面。請(qǐng)照以下的步驟修改此例子。
1. 修改web.config,加入程序3-15中粗體字部分的設(shè)定值。
2. 創(chuàng)建一個(gè)HTML網(wǎng)頁(yè),內(nèi)容如程序3-16所示。
程序3-15
Samples\3\AjaxDemo1\web.config <system.web> <customErrors defaultRedirect="GenericError.htm" mode="On"/> ……………
程序3-16
Samples\3\AjaxDemo1\GenericError.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <meta http-equiv="Content-Type" content="text/html; charset=big5"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untitled Page</title> </head> <body> 處理期間發(fā)生錯(cuò)誤!! </body> </html>
重新運(yùn)行程序后,便會(huì)發(fā)現(xiàn)當(dāng)點(diǎn)擊Button后,錯(cuò)誤不再以信息窗方式顯示,而是自動(dòng)導(dǎo)向GenericError.htm頁(yè)面,如圖3-13所示。

圖3-13
當(dāng)Async-Postback處理的時(shí)間過(guò)長(zhǎng)時(shí),Client端也會(huì)引發(fā)異常來(lái)終止此次要求,這個(gè)時(shí)間可通過(guò)ScriptManager控件的AsyncPostbackTimeOut屬性來(lái)設(shè)定,單位是秒,默認(rèn)值是90秒,也就是當(dāng)Client端送出Async-Postback要求后等待Server響應(yīng),若超過(guò)90秒未收到Server響應(yīng),那么客戶端自身就會(huì)終止此次要求。請(qǐng)照以下步驟修改本例。
1. 設(shè)定ScriptManager控件的AsyncPostbackTimeOut屬性為20。
2. 在Button控件之Click事件鍵入程序3-17的程序代碼。
程序3-17
Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs protected void Button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(30000); }
運(yùn)行程序后點(diǎn)擊Button,等待20秒后瀏覽器便會(huì)顯示錯(cuò)誤信息,如圖3-14所示。

圖3-14
咦,先前不是已經(jīng)設(shè)定錯(cuò)誤時(shí)所導(dǎo)向的頁(yè)面了嗎?為何此處仍然以信息窗顯示?別弄混了,AsyncPostbackTimeout屬性所針對(duì)的是Client端的等待時(shí)間,也就是點(diǎn)擊Button后Client端所等待響應(yīng)的時(shí)間,若時(shí)間到Client端未收到Server的響應(yīng),便直接顯示Timeout的信息,所以這與Server端的錯(cuò)誤機(jī)制無(wú)關(guān)。
- 繪制進(jìn)程圖:可視化D++語(yǔ)言(第1冊(cè))
- 嵌入式系統(tǒng)及其開(kāi)發(fā)應(yīng)用
- Mastering Matplotlib 2.x
- Go Machine Learning Projects
- 大數(shù)據(jù)專業(yè)英語(yǔ)
- 空間機(jī)器人遙操作系統(tǒng)及控制
- Hadoop Real-World Solutions Cookbook(Second Edition)
- Ceph:Designing and Implementing Scalable Storage Systems
- C語(yǔ)言寶典
- Microsoft System Center Confi guration Manager
- Learn QGIS
- 筆記本電腦電路分析與故障診斷
- Apache Spark Quick Start Guide
- 傳感技術(shù)基礎(chǔ)與技能實(shí)訓(xùn)
- Arduino創(chuàng)意機(jī)器人入門:基于ArduBlock(第2版)