ajax|object|request|错误Ajax Hacks-hack8 处理Request Object 的错误 让Ajax能检测服务器的错误,并能像用户提供有用的信息。 本hack跟踪错误并显示出错误信息,当Ajax程序失去服务器连接的时候。 问题, 问题... 正在连接的web应用程序或服务器组件暂时不可用。 当requst对象调用open方法时,代码使用了不同的主机地址而不是用户下载的web页面地址。当调用open方法时,request对象抛出一个异常。 你可以在其他地方使用本hack的异常处理方法。hack还使用了hack6种的股票计算程序代码。看一下html代码: “http://www.w3.org/TR/1999/REC-html401–19991224/strict.dtd”> Figure 1-11. Request a stock’s price 我们感兴趣的代码是能捕获异常的部分,后台服务器关闭、错误、或者错误的URL。handleResponse函数是事件处理函数用来管理服务器响应,request.onreadystatechange=handleResponse。接下来的代码使用try/catch/finally 来捕获并处理无效数字这一问题。 function handleResponse( ){ try{ } 下面看一下用来处理不同异常的代码。 try块将抛出内部的任何异常,而相应的catch将捕获这个异常,并解决异常。try catch是相对的。 当主机挂掉了会发生什么呢?尽管你请求的URL是正确的。这种情况下,试图访问request.status 属性的代码会抛出一个异常,应为request对象没有从服务器接收到响应,以及相应的状态属性。 Figure 1-12. Uh-oh, server down 代码显示了用户的信息,以及更多异常错误的相关信息。你可以不管学些信息,不过这些对程序的修改和调试很有帮助。 代码里的错误变量是JavaScript错误对象。对象的信息属性就是一个错误信息,是由JavaScript引擎产生的string。 如果没有使用 TRy/catch/finally 机制,用户只能看到很不容易懂得由JavaScript引擎产生的错误信息。在关闭这个讨厌的错误提示框以后,用户就无法了解应用程序的更多状态信息了。 有时,服务器或主机运行正常,但是要连接的服务器组件有问题。这样的情况下,request.status 属性的值是503(服务不可用)。因为状态属性的值不是200,代码的这一部分将捕获这个异常: } else { 换句话说,用户可以在弹出窗口中看到应用程序状态信息。也可以显示服务器组件的错误。这样的情况下,响应状态码是500(内部服务错误)。此外404状态响应码表示服务器的静态或动态组件无法找到请求的URL,就是常见的令人讨厌的400错误(页面不存在或被删除)。 try/catch/finally语句只适用于1.4或更高的版本中。finally语句是可选的。 令人沮丧的错误的URL function httpRequest(reqType,url,asynch){ alert( 另一种情况是请求的URL不是所想的。例如,用户想从http://www.myorg.com/app下载页面,但是打开的URL却是http://www.myorg.com,这样的错误也可以使用try/catch/finally 语句捕获。 本hack讲述了Ajax常见的异常以及捕获他们的办法。
Ajax技术的魅力在于允许JavaScript能在用户不干预的情况下与服务器连接。然而JavaScript开发者经常无法控制服务器组件(可能是一个web服务或其他软件)。尽管你的应用程序包括了你自己的服务器组件,也无法保证服务器永远运行正常或者用户遇到错误。因此,当程序出错时候,必须保证应用产业程序能恢复。
Hack捕获下列异常事件,并为应用程序推荐解决的办法:
应用程序连接的服务器挂掉了,或者URL改变了。
要连接的服务器组件错误,在连接的过程中发作了。Your total Stock Holdings
var statusMsg=“”;
try{
if(request.readyState == 4){
if(request.status == 200){
/* Check if the return value is actually a number.
If so, multiple by the number
of shares and display the result */
var stockPrice = request.responseText;
if(isNaN(stockPrice)) { throw new Error(
“The returned price is an invalid number.”;}
if(isNaN(numberOfShares)) { throw new Error(
“The share amount is an invalid number.”;}
var info = “Total stock value: $”+
calcTotal(stockPrice);
displayMsg(document.
getElementById(“msgDisplay“,info,“black”;
document.getElementById(“stPrice“.style.fontSize=”0.
9em”;
document.getElementById(“stPrice“.innerHTML =“price: ”+
stockPrice;
} catch (err) {
displayMsg(document.getElementById(“msgDisplay”,
“An error occurred: ”+
err.message,“red”;
}
} else {
//request.status is 503 if the application isn‘t available;
//500 if the application has a bug
alert(
“A problem occurred with communicating between the ”
“XMLHttpRequest object and the server program. ”+
“Please try again very soon”;
}
}//end outer if
} catch (err) {
alert(“It does not appear that the server ”+
“is available for this application. Please ”+
“try again very soon. \\nError: ”+err.message);
}
因此,代码会弹出一个警告对话框来提示用户。
Figure 1–12 depicts what the alert window looks like after this type of error.
//request.status is 503 if the application isn‘t available;
// 500 如果服务有错误
alert(
“A problem occurred with communicating between the ”
“XMLHttpRequest object and the server program. ”+
“Please try again very soon”;
}
如果用户请求的URL是错误的或已经改变了,会发生什么呢? 调用request.open方法会抛出异常,因此必须放在try/catch/finally语句里边处理。
在犯法initReq( )里边,有相应的代码:
//Mozilla-based browsers
if(window.XMLHttpRequest){
request = new XMLHttpRequest( );
} else if (window.ActiveXObject){
request=new ActiveXObject(“Msxml2.XMLHTTP”;
if (! request){
request=new ActiveXObject(“Microsoft.XMLHTTP”;
}
}
//the request could still be null if neither ActiveXObject
//initialization succeeded
if(request){
initReq(reqType,url,asynch);
} else {
alert(“Your browser does not permit the use of all ”+
“of this application‘s features!”;
}
}
/* Initialize a request object that is already constructed */
function initReq(reqType,url,bool){
try{
/* Specify the function that will handle the HTTP response */
request.onreadystatechange=handleResponse;
request.open(reqType,url,bool);
request.send(null);
} catch (err) {
“The application cannot contact the server at the moment.”+
“ Please try again in a few seconds.”;
}
}
Ajax Hacks-hack8 处理Request Object 的错误
80酷酷网 80kuku.com