Ajax程式:處理非同步呼叫中的異常(在客戶端呼叫Web Service代理時發生異常的處理辦法)
一個好的Web應用程式,強大的異常處理是少不了的。最近在學習Ajax的過程中,我總結了幾種不同情況下的處理非同步呼叫中異常的不同辦法;想分享給大家;
1,在客戶端呼叫Web Service代理時發生異常的處理辦法
2,使用Asp.NetAjax內建的異常處理方法
3,Web.Config中customError節中設定錯誤跳轉頁
此篇部落格總結的是:在客戶端呼叫Web Service代理時發生異常的處理方法。
由於Ajax的非同步效果,再加上後臺的執行,讓我們很難判斷某次對伺服器的請求是否順利完成,瀏覽器對Ajax程式執行時發生的異常無能為力;
Ajax的使用,使Web應用程式從客戶端想伺服器端發起非同步
在開發中提高效能,儘量避免這些異常,但是有些異常是避免不了的,這樣的話,我們就該處理這些異常。
當然,Asp.Net Ajax也考慮到了這些,並提供了一整套針對非同步回撥過程中發生的異常處理機制;
進入主題:在客戶端呼叫Web Service代理時發生異常的處理辦法;
客戶端呼叫Web Service代理的語法:
[NameSpace].[ClassName].[MethodName](param1,param2,...,
——其中:onSuceeded:成功時呼叫的函式;
onFailed:失敗時呼叫的函式;(本部落格介紹的重點之處)
onFailed回撥函式會接收一個型別為Sys.Net.WebServiceError的引數,表示異常物件。如下:
Function onFailed(error){
//顯示異常資訊
//處理異常資訊
}
注:
ASP.NET AJAX的客戶端Sys.Net.WebServiceError型別封裝了非同步請求伺服器時可能發生的異常,它提供了若干個只讀的屬性,提供了對異常資訊的詳細描述。Sys.Net.WebServiceError型別的屬性如下(在接下來的例子將會用到這些屬性):
屬 性 |
描 述 |
exceptionType |
獲取伺服器端異常的具體型別 |
message |
獲取詳細的異常描述資訊 |
statusCode |
獲取造成異常的HTTP響應的狀態碼 |
stackTrace |
獲取伺服器端異常的棧跟蹤資訊 |
timedOut |
獲取一個布林值,表示異常是否是由於網路連線超時造成的 |
例子:
伺服器端:ErroHandling.asmx
定義了兩個方法GetDivision(int a,int b):實現兩個整數相除,並返回相除結果; int Timeout():
<%@ WebService Language="C#" Class="ErrorHandling" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Threading;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ErrorHandling : System.Web.Services.WebService
{
[WebMethod]
public int GetDivision(int a, int b)
{
return a / b;
}
[WebMethod]
public int Timeout()
{
Thread.Sleep(5000);
return 0;
}
}
(注意:Web Service類要新增[ScriptService]標記;在方法上標記[WebMethod]表示:伺服器端釋放該方法,客戶端可訪問伺服器端的該方法)
客戶端呼叫伺服器端的GetDivision(int a,int b)函式,並傳入兩個引數:2,0;程式藉助Asp.Net Ajax非同步通訊層將引數傳送至伺服器,伺服器完成計算後將結果返回至客戶端;
顯然,因為輸入的被除數為0,伺服器端執行時必定要丟擲異常;但是
並沒有在伺服器端做異常處理,此時客戶端也許會顯示異常錯誤,但是如果客戶端並沒有顯示異常錯誤,那麼客戶端的使用者就要無限期的等下去,可見是多麼的不合理;那麼如何在客戶端處理此類異常?
新建Asp.Net頁面5_ClientProxy.aspx;前臺新增ScriptManager控制元件(
和UpdatePanel控制元件聯合使用可以實現頁面非同步區域性更新的效果),及ErrorHandling.asmx的引用:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="ErrorHandling.asmx" />
</Services>
</asp:ScriptManager>
新增兩個按鈕,並且分別在單擊事件中呼叫getDivision(int a,int b)和timeout()方法:(注:getDivision()函式傳入的引數為5,0:即被除數為0)
<input type="button" value="getDivision" onclick="getDivision(5, 0)" />
<input type="button" value="timeout" onclick="timeout()" />
<script language="javascript" type="text/javascript">
ErrorHandling.set_timeout(2000);
//getDivision(int a,int b)方法:
function getDivision(a, b)
{
function getDivision(a, b)
{
ErrorHandling.GetDivision(a, b, succeededCallback,failedCallback);
//呼叫伺服器端GetDivision(int a,int b)函式,成功時的回撥函式為succeededCallback(),失敗時的回撥函式為failedCallback()
}
}
function timeout()
{
ErrorHandling.Timeout(succeededCallback, failedCallback);
}
function succeededCallback(result)
{
alert(result)
}
function failedCallback(error, userContext, methodName)
{
// ASP.NET AJAX的客戶端Sys.Net.WebServiceError型別封裝了非同步請求伺服器時可能發生的異常,它提供了若干個只讀的屬性,提供了對異常資訊的詳細描述。Sys.Net.WebServ- iceError型別的屬性,如下:
//屬 性 描 述
//exceptionType 獲取伺服器端異常的具體型別
//message 獲取詳細的異常描述資訊
//statusCode 取造成異常的HTTP響應的狀態碼
//stackTrace 獲取伺服器端異常的棧跟蹤資訊
//timedOut 獲取一個布林值,表示異常是否是由於網路連線超時造成的
var message = String.format(
"Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",
error.get_timedOut(),
error.get_message(),
error.get_exceptionType(),
error.get_stackTrace());
alert("Error at " + methodName + "\n\n" + message);
}
</script>
點選"getDivision"按鈕:因為被除數為0,有異常,所以呼叫回撥函式failedCallback(),執行結果如下圖;假如傳入的引數為5,1,則呼叫succeededCallback()函式:
點選"timeout"按鈕:因為睡眠時間為5秒,超過設定的2秒,所以所以呼叫回撥函式failedCallback(),執行結果如下圖;假如設定6秒,則呼叫succeededCallback()函式:
總結:
本篇部落格主要講:在客戶端呼叫Web Service代理時發生異常的處理辦法,以及Sys.Net.WebServiceError型別的屬性的使用