2010-04-08 12 views
5

Uso de la versión de prototipo 1.6.0.2.Funciones de devolución de llamada de prototipo que se saltan excepciones

Tengo un problema común donde se tragan excepciones cuando se lanzan en una función de devolución de llamada, generalmente cuando trato de manejar la respuesta a una llamada Ajax.Request. Aquí está un ejemplo sencillo:

marcado HTML:

<input type="button" id="myButton" value="Press Me" /> 

Javascript:

MYSITE = {}; 

document.observe("dom:loaded", function() { 

    // Set up our helper object 
    MYSITE.pageHelper = new MYSITE.PageHelper(); 

}); 


MYSITE.PageHelper = function() { 

    console.log("PageHelper called."); 

    $("myButton").observe("click", this.makeCall.bindAsEventListener(this)); 

}; 

MYSITE.PageHelper.prototype.makeCall = function() { 

    console.log("Make call."); 

    new Ajax.Request(
      "remoteCall.cfm", 
      { 
       method: 'get', 
       parameters: "", 
       onComplete: this.handleCallback.bindAsEventListener(this) 

      }); 


}; 

MYSITE.PageHelper.prototype.handleCallback = function(resp) { 

    console.log("Start callback processing..."); 

    var x = missingVar + "text"; // This line generates an exception... 

    console.log("Finished callback processing."); 
}; 

OK, por lo que el problema es que si se ejecuta este código en Firefox con Firebug no es una excepción se emitirá para la línea ofensiva: es tragada. Trago. La única forma que conozco de detectar esto (por ejemplo, si estoy depurando) es ajustar el contenido de la función de devolución de llamada en un try/catch. Por ejemplo:

MYSITE.PageHelper.prototype.handleCallback = function(resp) { 

    try { 

     console.log("Start callback processing..."); 

     var x = missingVar + "text"; // This line generates an exception... 

     console.log("Finished callback processing."); 

    } catch (e) { 
     console.log(e); 
    } 
}; 

¿Alguien más ha encontrado este problema? ¿Alguna solución temporal por ahí?

¡Gracias de antemano! comportamiento

Respuesta

4

A partir de hoy, esto se conoce:

http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/e71c7a6bfb656380/7d1c8a23edc07f03?lnk=gst&q=exception+swallowed#

Hay un boleto en una mejora para hacer frente a estas excepciones tragado aquí:

https://prototype.lighthouseapp.com/projects/8886/tickets/634-no-exception-on-error-in-oncreate-method-of-ajaxrequest

Uno de obra alrededor sugerido es agregar el siguiente código (¡gracias Glenn Maynard!):

Ajax.Responders.register({ 
     onException: function(request, exception) { 
       (function() { throw exception; }).defer(); 
     } 
}); 

Espero que ayude a otros con el mismo problema hasta que se implemente una solución más permanente.

+0

Creo que el código que ha citado solo funciona para eventos Ajax, no para los simples tipos de eventos onClick sobre los que se ha formulado la pregunta. –

+0

¡Esta es 'la' solución! Debe implementar el método Ajax.Responders -> onException como se ilustra arriba. –

+0

Esto es excelente, gracias por diseñarlo bien con todas las fuentes – febs

Cuestiones relacionadas