jQuery:捕获ajax异常

jQuery: catch ajax exceptions

许多失败的jquery-ajax请求正以错误的方式污染我的控制台。查看产生这些控制台错误的代码(jquery 1.7.2,第8240行)

1
2
3
4
                // Do send the request
                // This may raise an exception which is actually
                // handled in jQuery.ajax (so no try/catch here)
                xhr.send( ( s.hasContent && s.data ) || null );

我注意到这条评论解释了为什么没有trycatch。但是,即使我在我的jQuery.ajax请求中有一个显式的error回调函数,我仍然没有由jQuery.ajax处理这些错误。

如何处理jquery-ajax错误,使错误消息不会出现在控制台中?

编辑:下面是执行Ajax请求的代码片段,以及精确的错误消息(在chrome中):

1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
    dataType: 'xml',
    url:"./python/perfdata.xml?sid=" + (new Date()),
    success: function (data) {
        var protocols = $("Protocols", data).children();

        parseData(protocols);
    },
    error: function (error) {
        setTimeout(getData, 200);
    }
});

下面是chrome错误消息:

1
2
3
GET
http://zeus/dashboard/python/perfdata.xml?sid=Thu%20May%2024%202012%2016:09:38%20GMT+0100%20(GMT%20Daylight%20Time)
jquery.js:8240


可以使用自定义函数来执行此操作

1
 $(document).ajaxError(ajaxErrorHandler);

在那个处理程序中设置你需要做的任何事情

1
2
3
var ajaxErrorHandler = function () {
        //do something
    }


如果要进行测试,您可以(在chrome中)通过重写函数"send"来尝试此操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$(function() {

    var xhr = null;

    if (window.XMLHttpRequest) {
        xhr = window.XMLHttpRequest;
    }
    else if(window.ActiveXObject('Microsoft.XMLHTTP')){
        // I do not know if this works
        xhr = window.ActiveXObject('Microsoft.XMLHTTP');
    }

    var send = xhr.prototype.send;
    xhr.prototype.send = function(data) {
        try{
            //TODO: comment the next line
            console.log('pre send', data);
            send.call(this, data);
            //TODO: comment the next line
            console.log('pos send');
        }
        catch(e) {
            //TODO: comment the next line
            console.log('err send', e);
        }
    };

    $.ajax({
        dataType: 'xml',
        url:"./python/perfdata.xml?sid=" + (new Date()).getTime(),
        success: function (data) {
            var protocols = $("Protocols", data).children();

            parseData(protocols);
        },
        error: function (error) {
            setTimeout(getData, 200);
        }
    });
});

?测试


你试过了吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  $.ajaxSetup({
    timeout:10000,
    beforeSend: function(xhr) {
      //
    },
    complete:function(xhr,status) {
      //
    },      
    error: function(xhr, status, err) {
      switch (status){
      case 'timeout': {}
      case 'parseerror': {}
      case 'abort': {}
      case 'error': {}
      default: {}
      }
    }
  });

我收到了500个内部服务器错误,当它指向行xhr.send( ( s.hasContent && s.data ) || null );

但是当我检查ApacheLogs(内部服务器错误)时,错误在其他代码中是另一回事。

请也检查一下。