jquery ajax忽略500状态错误

我正在向App Engine应用程序发出一些GET请求,在Chrome中进行测试。 虽然我可以在javascript控制台中看到一些调用导致500服务器错误,但我似乎无法在我的jQuery代码中发现捕获此错误,尽管读取了许多类似的SO线程。 我知道它表示服务器端错误,但我仍然希望能够从我的javascript中捕获这样的错误。

我需要捕获错误,以便我可以计算响应的数量(成功或其他),并在收到所有呼叫响应时触发另一个function。

Chrome控制台输出:

GET http://myapp.com/api?callback=jQuery12345&params=restOfParams 500 (Internal Server Error) 

我的电话:

  function makeCall() { var count = 0; var alldata = $('#inputset').val(); var rows = alldata.split('\n'); var countmatch = rows.length; for (i=0;i<rows.length;i++) { data["param"] = rows[i]["val"]; $.ajax({ url: apiUrl, type: 'GET', data: data, dataType: 'jsonp', error: function(){ alert('Error loading document'); count +=1; }, success: function(responseJson) { count +=1; var res = responseJson.results; if (count == countmatch) { allDoneCallback(res); } }, }); } } 

我尝试了以下一些方法:
添加:

 statusCode: {500: function() {alert('err');}} 

打电话。

使用:

  $().ready(function(){ $.ajaxSetup({ error:function(x,e) { if(x.status==500) { alert('Internel Server Error.'); } } }); }); 

有人会就如何捕获500响应提出建议吗?

谢谢奥利

更新:

基于响应,我的jquery代码看起来是正确的,但由于某种原因,它只会捕获从我的应用程序收到的某些500响应。 这可能是App Engine如何返回错误的问题(我对此不太了解),或者jquery如何使用jsonp处理错误 – 这一点在本文的最后一段中进行了简要讨论。

我通过使用jquery-isonp来实现这一点 ,它捕获了应用程序抛出的所有500个状态。

它看起来并不像你正在使用jQuery的document.ready绑定。 $().ready(...)版本或多或少已弃用。 尝试其中之一:

 $(document).ready(function() { $.ajaxSetup({ error: function(x, e) { if (x.status == 500) { alert('Internel Server Error.'); } } }); }); 

或速记 :

 $(function() { $.ajaxSetup({ error: function(x, e) { if (x.status == 500) { alert('Internel Server Error.'); } } }); }); 

通过将jQuery从1.9.1升级到2.1.1解决了这个问题 – 现在它开始在服务器响应上调用.error() (在忽略500响应并等到超时结束之前)。

限制:jQuery 2.1.1不支持IE8及以下(因为IMO不应该你)

我有一个类似的问题,我使用.done,.fail,.always的jquery的promise函数,如果我遇到500内部服务器错误,那么它不会触发任何函数(完成,失败,总是,错误)。 很奇怪。

最后我在.ajax选项中添加了一个超时,当它达到超时时它会抛出一个错误并运行.fail方法。

 searchify.myAjaxSearchTerms = $.ajax({ 'url': url, type: "GET", 'dataType': 'jsonp', 'jsonp': 'json.wrf', 'jsonpCallback': searchify.cbFunc, timeout: 4000, //needed for 500 errors - will go to fail block on timeout beforeSend: searchify.beforeSendAutocomplete }); searchify.myAjaxSearchTerms.fail(function(XHR, status, error){ searchify.clearForm(); searchify.renderWarningForNoQuery('
Sorry. We had a problem performing that search...
Please try again
Enter a product name, catalogue number or keyword
'); });