论坛首页 Web前端技术论坛

Ajax.Request如何捕获异常?

浏览 10585 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-31  
prototype1.4.0.js
              var  options={  
                           method:"post",  
                           parameters:pars,  
                           onSuccess:function(transport);{  
                                       $('result');.value=transport.responseText;  
                           },  
                            onFailure:function();{  
                                       alert("失败!!");;  
                           }  
               };  
 
           var  myAjax  =  new  Ajax.Request(url,options);;  

当服务端发生异常信息,onFailure方法并没有被调用,而还是执行onSuccess或onComplete,并且把异常信息显示到result,原先服务端出现异常的时候会统一调用exception.jsp显示异常信息,但用Ajax有没有办法做统一处理异常信息呢?
   发表时间:2006-03-31  
zrweng 写道
prototype1.4.0.js
              var  options={  
                           method:"post",  
                           parameters:pars,  
                           onSuccess:function(transport);{  
                                       $('result');.value=transport.responseText;  
                           },  
                            onFailure:function();{  
                                       alert("失败!!");;  
                           }  
               };  
 
           var  myAjax  =  new  Ajax.Request(url,options);;  

当服务端发生异常信息,onFailure方法并没有被调用,而还是执行onSuccess或onComplete,并且把异常信息显示到result,原先服务端出现异常的时候会统一调用exception.jsp显示异常信息,但用Ajax有没有办法做统一处理异常信息呢?


我想问题可能是这样:

Ajax.Request 是根据 XMLHttpRequest 的 status code 返回值来判断成功失败的,而服务端虽然发生异常,但是服务端的框架可能自动转向到错误处理页面了,而错误处理页面返回的 status code 依然是正常的 200,你可以通过打印(xhr.responseText) 检查一下返回的页面数据是否就是错误页的HTML源码。

所以如果你要利用 onFailure 事件,那么就只有改造下服务端的程序,比如可能是一个servlet,当发生异常时,直接返回HTTP协议设置的异常 status code(500+)。或者就是自己封装一下错误信息,在onComplete方法中先parse 一下。
0 请登录后投票
   发表时间:2006-03-31  
确实,看来我也只能在response XML 加上<ErrorCode/>在客户端解析显示对应错误信息了
0 请登录后投票
   发表时间:2006-04-01  
服务器发生异常了,不代表这次请求的js发生异常了。所以只能用特定的node来标志异常了。
0 请登录后投票
   发表时间:2006-04-09  
把服务器的状态写入JSON头里面,
response.setHeader("X-JSON",myjsonString);
在你自定义的onSuccess方法中第二个参数即是Prototype自动eval后的json对象:
onSuccess:function(resp,jsonObj);
{
    if(jsonObj.statusCode == 100);   //这是你自定义的json对象的状态属性
   {
          alert("保存失败,原因:" + jsonObj.statusMsg);;
          return;
     }
     alert("保存成功");;
     //这里是你自定义的代码
}

关于JSON,请参考http://www.json.org,那里面有几个JAVA类,很方便.
Note:在服务器设置response.setHeader时,JSON对象前后必须加上括号,看看Prototype的Ajax的代码就知道了,它是直接eval的.
PS:感觉楼主没有分清楚HTTP STATUS与服务器内部异常
0 请登录后投票
   发表时间:2006-04-09  
yfmine 写道
把服务器的状态写入JSON头里面,
response.setHeader("X-JSON",myjsonString);
在你自定义的onSuccess方法中第二个参数即是Prototype自动eval后的json对象:
onSuccess:function(resp,jsonObj);
{
    if(jsonObj.statusCode == 100);   //这是你自定义的json对象的状态属性
   {
          alert("保存失败,原因:" + jsonObj.statusMsg);;
          return;
     }
     alert("保存成功");;
     //这里是你自定义的代码
}

关于JSON,请参考http://www.json.org,那里面有几个JAVA类,很方便.
Note:在服务器设置response.setHeader时,JSON对象前后必须加上括号,看看Prototype的Ajax的代码就知道了,它是直接eval的.
PS:感觉楼主没有分清楚HTTP STATUS与服务器内部异常


这个方法很好。
以前看prototype的json时,还不以为多此一举。直接用http body传递的数据,何苦非要用json放到head里面?
今天yfmine指点,终于知道他的用意了~
0 请登录后投票
   发表时间:2006-04-09  
prototype 1.5.0_rc0
735行
引用
return eval('(' + this.header('X-JSON') + ')');


而在1.5.0_pre0是:
引用

return eval(this.header('X-JSON'));


怎么差异这么大
0 请登录后投票
   发表时间:2006-04-10  
liusong1111 写道
prototype 1.5.0_rc0
735行
引用
return eval('(' + this.header('X-JSON') + ')');


而在1.5.0_pre0是:
引用

return eval(this.header('X-JSON'));


怎么差异这么大

果然,1.4的也是return eval(this.header('X-JSON'));
还没正式用1.5,多谢提醒.我猜作者也觉得这样不够方便,所以才改了...
0 请登录后投票
   发表时间:2006-04-10  
之前用过1.3.1,现在在用1.4。
不知1.5有何改进?楼上两位可否指点一下:)
0 请登录后投票
   发表时间:2006-04-11  
好像主要是增加了个"$$"符,参见号,http://dev.rubyonrails.org/browser/spinoffs/prototype?rev=3432
在MSN rss搜索里找javascript prototype selector也能搜到几篇文章.还加了一堆String的方法,还没去研究.你用文本工具比较一下1.4和1.5源代码就知道变化了啊.
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics