2010-04-27 13 views
7

¿Hay alguna manera de manejar las excepciones lanzadas desde las devoluciones de llamada AJAX en jQuery, además de agregar un bloque try..catch a cada devolución de llamada? La función de error no se llama en esta situación.Excepciones lanzadas en devoluciones de jQuery AJAX ingeridas?

$.ajax(
{ 
    url: 'myurl.rails', 
    success: function(data) 
    { 
     throw 'Oh no!'; 
    }, 
    error: function (xhr, textStatus, errorThrown) 
    { 
     console.log('AJAX call failed', xhr, textStatus, errorThrown); 
    }    
}); 

Respuesta

5

Si echa un vistazo a la versión no minificada de jQuery 1.4.2, las líneas relevantes son 5264 a 5274. jQuery simplemente llama a la función success aplicada al objeto de configuración (si existe) sin importar lo que la función regresa o arroja.

Lo que puede hacer en su lugar es utilizar jQuery.ajaxSetup() así:

jQuery.ajaxSetup({ 
    success: function() { 
     try { 
      if (this.mysuccess) { 
       this.mysuccess.apply(this, arguments); 
      } 
     } 
     catch(err) { 
      // whatever 
     } 
    } 
}); 

y el uso mysuccess (o lo que usted prefiere llamarlo) en lugar de success en los jQuery.ajax llamadas individuales.

+0

Tengo curiosidad si alguien sabe * por qué * no importa si se lanza una excepción: http://stackoverflow.com/questions/11800349/why-does-jquery-swallow-exceptions-in-ajax-success- devoluciones de llamada –

0

¿Has mirado en ninguna de las características globales de AJAX de jQuery como ajaxSetup y ajaxError?

+1

Como mencionó Justin, la devolución de llamada error/ajaxError es para solicitudes fallidas, no para excepciones lanzadas en el código de la aplicación en la devolución de llamada exitosa. – MikeWyatt

0

La devolución de llamada error está diseñada para usarse cuando hay un problema con la solicitud en sí. De acuerdo con los documentos:

Una función que debe invocarse si la solicitud falla. La función recibe tres argumentos: el objeto XMLHttpRequest, una cadena que describe el tipo de error que ocurrió y un objeto de excepción opcional, si se produjo. Los valores posibles para el segundo argumento (además de nulo) son "timeout", "error", "notmodified" y "parsererror".

Por lo tanto, si por el contrario hay un problema con los datos que vuelvas, entonces usted debe tratar con él dentro de la success devolución de llamada - tal vez ingresando a la consola, o notificar al usuario.

+0

Uso un poco de AJAX en mi sitio, y ajustar cada devolución de llamada de éxito en un bloque try..catch con el registro no es ideal. – MikeWyatt

+0

¿Hay algún tipo de error específico que esté viendo en su sitio? ¿Qué estás viendo exactamente y qué piensas hacer una vez que detectas un error? –

+0

Solo quiero registrar las excepciones que puedan arrojarse. El tipo de excepción específica no importa, salvo que sea inesperado. – MikeWyatt

Cuestiones relacionadas