如何捕获 jQuery AJAX 错误?

Posted

技术标签:

【中文标题】如何捕获 jQuery AJAX 错误?【英文标题】:How can I catch jQuery AJAX errors? 【发布时间】:2013-09-22 18:29:11 【问题描述】:

当 AJAX 请求被提交到站点时,使用 jQuery 承诺方法可以轻松处理服务器端错误。 .done().fail() 等。但是对于某些请求(例如,对无效站点或不接受跨域请求的站点),在进行调用时会立即发生异常。这是控制台中一个错误的示例:

XMLHttpRequest 无法加载 http://someotherserver/api/blahblah。起源 Access-Control-Allow-Origin 不允许http://localhost:52625

是的,我知道 CORS……这不是问题所在。我实际上在做的是尝试一个 web api 调用来测试服务器 IP/名称是否正确

我知道 jQuery 请求语法中的 error 选项:

$.ajax(
    url: remoteURL,
    type: 'GET',
    error: function (err) 
        console.log("AJAX error in request: " + JSON.stringify(err, null, 2));
    
).etc.etc.

此处处理了错误,但控制台中仍会记录异常。将上述内容包装在 try-catch 块中似乎是合理的,但这似乎没有帮助。

我找到了this question,但解决方案涉及破解 jQuery 代码。肯定有更好的方法来捕获这些错误并且不会阻塞控制台日志??

【问题讨论】:

我认为不可能,因为错误记录是由浏览器网络监控层完成的 小型临时服务器将部署在野外营地环境中。我的用户将需要为 ajax Web api 调用设置服务器 IP 地址的选项。我需要一种方法来测试地址是否有效。如果有更好的方法,我很高兴听到它。 :) 检查***.com/questions/377644/…,也许你会得到你的解决方案。 @ripa:恐怕不会——错误是在任何服务器端代码运行之前生成的。 @AR。在 ajax 发布错误到来之前!!!! :( 【参考方案1】:

试试这个:

$.ajax(
    url: remoteURL,
    type: 'GET',
    error: function (err) 
        console.log("AJAX error in request: " + JSON.stringify(err, null, 2));
    
).always(function(jqXHR, textStatus) 
    if (textStatus != "success") 
        alert("Error: " + jqXHR.statusText);
    
);

XHR 监听器:

$.ajax(
    url: remoteURL,
    type: 'GET',
    xhr: function()
        var xhr = new window.XMLHttpRequest();
        xhr.addEventListener("error", function(evt)
            alert("an error occured");
        , false);
        xhr.addEventListener("abort", function()
            alert("cancelled");
        , false);

        return xhr;
    ,
    error: function (err) 
        console.log("AJAX error in request: " + JSON.stringify(err, null, 2));
    
);

【讨论】:

我试过 .always() 但它是在发出 ajax 请求之后调用的,之后的某个时间。我所指的浏览器错误会在请求启动时立即发生。 hmm...您可以尝试在发送请求之前添加一个 XHR 侦听器(稍等,编辑答案)【参考方案2】:

您可以在谷歌浏览器中使用网络开发者控制台。按 F12。并使用 Networks 选项卡检查响应,对于 JavaSvript 和 jQuery 和 Ajax 错误,您可以使用 Console 选项卡。 :)

通过添加到您的 ajax 函数来试试这个:

error: function(XMLHttpRequest, textStatus, errorThrown) 
 alert(errorThrown);

【讨论】:

用于调试目的 @ShreejiShah:是的,当然,这是我看到错误的控制台。您的回答对实际问题没有帮助。 :p

以上是关于如何捕获 jQuery AJAX 错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?

JQuery $.ajax 捕获异常信息

Sharepoint 2010 在 jquery/javascript 中捕获 webpart 刷新

如何在 ajax 调用成功中访问 jquery 对象 - 未捕获的错误:SYNTAX_ERR:DOM Exception 12

jQuery 修复“未捕获的 TypeError:$ 不是函数”错误 [重复]

Jquery ajax没有捕获404 [重复]