1. 程式人生 > >Ajax程式:處理非同步呼叫中的異常(在客戶端呼叫Web Service代理時發生異常的處理辦法)

Ajax程式:處理非同步呼叫中的異常(在客戶端呼叫Web Service代理時發生異常的處理辦法)

一個好的Web應用程式,強大的異常處理是少不了的。最近在學習Ajax的過程中,我總結了幾種不同情況下的處理非同步呼叫中異常的不同辦法;想分享給大家;

1,在客戶端呼叫Web Service代理時發生異常的處理辦法

2,使用Asp.NetAjax內建的異常處理方法

3,Web.ConfigcustomError節中設定錯誤跳轉頁

此篇部落格總結的是:在客戶端呼叫Web Service代理時發生異常的處理方法。

由於Ajax的非同步效果,再加上後臺的執行,讓我們很難判斷某次對伺服器的請求是否順利完成,瀏覽器對Ajax程式執行時發生的異常無能為力;

Ajax的使用,使Web應用程式從客戶端想伺服器端發起非同步

Http協議請求,在理想情況下是沒有問題的,但是Web程式的執行並不是一直順利的,它有著很多不確定性——網路故障、。。。開發者的粗心大意,一旦出現問題就會導致非同步請求失敗

在開發中提高效能,儘量避免這些異常,但是有些異常是避免不了的,這樣的話,我們就該處理這些異常。

當然,Asp.Net Ajax也考慮到了這些,並提供了一整套針對非同步回撥過程中發生的異常處理機制;

進入主題:在客戶端呼叫Web Service代理時發生異常的處理辦法;

客戶端呼叫Web Service代理的語法:

[NameSpace].[ClassName].[MethodName](param1,param2,...,

onSuceeded,onFailed)

——其中: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型別的屬性的使用