在傳統的Web應用程式中,處理異常相對來說比較簡單——即使開發人員不作任何處理,瀏覽器也會預設地將收到的異常資訊顯示在瀏覽器中。而對於Ajax應用程式來說,事情卻並不那麼簡單。Ajax程式“非同步”的天性加上其後台啟動並執行行為,讓使用者乃至開發人員都很難判斷某次對伺服器的調用是否順利完成,瀏覽器自然也對Ajax程式運行時發生的異常無能為力。
在本章前面兩節中,藉助於 ASP.NET AJAX非同步通訊層的協助,我們已經能夠容易地從用戶端向伺服器端發起非同步HTTP請求——在理想情況下,這自然不會有問題,也足夠使用。然而,Web程式在運行中會有很多不確定性,從網路狀況的不穩定到開發人員的粗心大意,任何一個環節出了問題均會導致某次非同步呼叫以失敗告終。
因此,在ASP.NET AJAX非同步通訊層的實現中,自然也內建了對非同步呼叫時異常的處理方法。還記得前面曾經介紹過的在用戶端調用Web Service代理的文法嗎?
[NameSpace].[ClassName].[MethodName](param1, param2,..., callbackFunction)
在調用成功的回呼函數callbackFunction的後面,我們還可以提供另一個調用失敗的回呼函數。這樣,用戶端調用Web Service代理的文法就變為:
[NameSpace].[ClassName].[MethodName](param1, param2,..., onSucceeded, onFailed)
注意其中粗體部分新添加的onFailed回呼函數,該函數將在本次非同步通訊出現異常時由ASP.NET AJAX非同步通訊層調用。而onSucceeded的行為不會受到任何影響,仍將在成功調用後執行。
onFailed回呼函數將接受一個類型為Sys.Net.WebServiceError的參數,表示異常對象。其函數簽名將類似如下所示:
function onFailed(error) {
// 取得異常資訊並處理。
}
ASP.NET AJAX的用戶端Sys.Net.WebServiceError類型封裝了非同步請求伺服器時可能發生的異常,它提供了若干個唯讀屬性,提供了對異常資訊的詳細描述。Sys.Net.WebServ- iceError類型的屬性如表3-1所示。
表3-1 Sys.Net.WebServiceError類型的屬性
屬性 |
描述 |
exceptionType |
擷取伺服器端異常的具體類型 |
message |
擷取詳細的異常描述資訊 |
statusCode |
擷取造成異常的HTTP響應的狀態代碼 |
stackTrace |
擷取伺服器端異常的棧跟蹤資訊 |
timedOut |
擷取一個布爾值,表示異常是否是由於網路連接逾時造成的 |