2010-04-08 8 views
5

Utilisation de Prototype version 1.6.0.2.Fonctions de rappel de prototype avalant des exceptions

J'ai un problème commun où les exceptions sont avalées lorsqu'elles sont lancées dans une fonction de rappel, généralement lorsque j'essaie de gérer la réponse à un appel Ajax.Request. Voici un exemple simple:

balisage 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, donc le problème est que si vous exécutez ce code dans Firefox avec Firebug Aucune exception ne sera sortie pour la ligne fautive - c'est avalé. Gorgée. La seule façon que je connaisse pour attraper ceux-ci (disons si je débogue) est d'envelopper le contenu de la fonction de rappel dans un try/catch. Par exemple:

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

Est-ce que quelqu'un d'autre a déjà rencontré ce problème? Des solutions de rechange?

Merci d'avance!

Répondre

4

A partir d'aujourd'hui, ce comportement est connu:

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

Il y a un ticket pour une amélioration de traiter ces exceptions avalés ici:

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

Un TRAVAiL autour suggéré est d'ajouter le code suivant (merci Glenn Maynard!):

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

Espérons que cela aidera les autres avec le même problème jusqu'à ce qu'une solution plus permanente soit implémentée.

+0

Je pense que le code que vous avez cité ne fonctionne que pour les événements Ajax, pas pour les types d'événements onClick simples sur lesquels la question a été posée. –

+0

Ceci est la solution! Vous devez implémenter la méthode Ajax.Responders -> onException comme illustré ci-dessus. –

+0

C'est excellent, merci de l'avoir bien jeté avec toutes les sources – febs