2012-05-24 33 views
14

Muchas solicitudes jQuery ajax fallidas están contaminando mi consola con errores. Mirar el código que produce estos errores de consola (jQuery 1.7.2, línea 8240)jQuery: catch ajax excepciones

   // 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); 

noto el comentario explica por qué no hay try/catch allí. Sin embargo, aunque tengo una función de devolución de llamada explícita error en mi solicitud jQuery.ajax, estoy todavía no teniendo esos errores manejados por jQuery.ajax.

¿Cómo puedo manejar los errores jQuery ajax de tal manera que aparezcan mensajes de error que no sean en la consola?

Editar: A continuación es mi fragmento de código que hace la petición Ajax, y el mensaje de error exacto (en Chrome):

$.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); 
    } 
}); 

Y aquí es el mensaje de error Chrome:

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

Puede publicar tanto el código que crea la solicitud AJAX como el mensaje de error completo. –

+0

http://api.jquery.com/ajaxError/ y http://api.jquery.com/jQuery.ajax/ – Blazemonger

+1

¿Intentó agregar un bloque 'try/catch' alrededor de la llamada' $ .ajax'? No estoy seguro de lo que significa ese error, pero parece que sucede cuando intento emitir la solicitud, y creo que '.ajaxError' solo funciona con errores en la respuesta. – bfavaretto

Respuesta

3

Puede probar esto (en cromo funciona bien) si para la prueba, anulando la función "enviar":

$(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); 
     } 
    }); 
}); 

test

+0

Interesante enfoque. – Randomblue

5

Se puede utilizar una función personalizada para hacerlo

$(document).ajaxError(ajaxErrorHandler); 

y configure lo que necesite en ese controlador

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

Ok, lo he intentado, pero luego 'ajaxErrorHandler' se ejecuta * ¡encima de * el error de la consola! – Randomblue

+1

¡Gracias! Esto realmente me ayudó :) – GobSmack

2

¿lo intentó?

$.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: {} 
     } 
    } 
    }); 
0

que estaba recibiendo 500 error interno del servidor y cuando me señaló a la línea xhr.send((s.hasContent && s.data) || null);

Pero cuando revisé los registros de Apache (error interno del servidor) error w como algo más en otro código.

Por favor, compruebe que una vez también.