6.6 错误处理

到现在为止,我们的请求都能够成功地完成,新内容都能如期显示在页面中。但负责任的开发也会考虑到网络或数据发生错误的可能性,并适当地记录或报告这些错误。在本地环境中开发Ajax应用有时候会让开发人员过于乐观,因为除了拼错URL这种简单的情况外,Ajax错误不会发生在本地。更加严重的,$.get().load()等快捷的Ajax方法并没有提供错误回调参数,因此我们需要找找其他地方是否有解决方案。

除了使用全局的.ajaxError()方法,我们还可以利用jQuery的延迟对象系统。第11章将讨论延迟对象的具体细节,现在只要知道可以给.load()之外的Ajax方法连缀.done().always().fail()方法,并通过它们添加相应的回调函数即可。比如,可以在代码清单6-16的基础上,把URL改为一个不存在的地址,然后测试.fail()方法,如代码清单6-17所示。

代码清单6-17

  1. $(document).ready(function() {
  2. $('#letter-e a').click(function(event) {
  3. event.preventDefault();
  4. var requestData = {term: $(this).text()};
  5. $.get('z.php', requestData, function(data) {
  6. $('#dictionary').html(data);
  7. }).fail(function(jqXHR) {
  8. $('#dictionary')
  9. .html('An error occurred: ' + jqXHR.status)
  10. .append(jqXHR.responseText);
  11. });
  12. });
  13. });

现在,单击字母E开头的任何链接都会产生一个错误,如图6-12所示。根据服务器的配置不同,jqXHR.responseText的内容可能会有所不同。

6.6 错误处理 - 图1

图 6-12

此外,.status属性中包含着服务器返回的状态码。这些代码由HTTP规范定义,当触发.fail()处理程序时,可以根据下表解读错误。

响 应 码说  明
400请求语法错误
401未授权
403禁止访问
404未发现请求的URL
500服务器内部错误

W3C站点(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)有完整的响应码列表。第13章还会更深入地介绍错误处理。