2010-04-08 4 views
5

Mit Prototype Version 1.6.0.2.Prototyp Callback-Funktionen Schlucken Ausnahmen

Ich habe ein häufiges Problem, wo Ausnahmen verschluckt werden, wenn sie in einer Callback-Funktion ausgelöst werden, typischerweise wenn ich versuche, die Antwort auf einen Ajax.Request Aufruf zu behandeln. Hier ist ein einfaches Beispiel:

HTML-Markup:

<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, also das Problem ist, dass, wenn Sie diesen Code in Firefox mit Firebug laufen keine Ausnahme ausgegeben wird für die beanstandete Linie - es ist geschluckt. Schluck. Der einzige Weg, den ich kenne, um diese zu fangen (sagen wir, wenn ich debugge) ist, den Inhalt der Callback-Funktion in einen try/catch zu wickeln. Zum Beispiel:

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

Hat jemand anderes jemals auf dieses Problem stoßen? Irgendwelche Workarounds da draußen?

Vielen Dank im Voraus!

Antwort

4

Ab heute ist dieses bekannte Verhalten:

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

Es gibt ein Ticket in für eine Erweiterung mit diesen geschluckt Ausnahmen beschäftigen sich hier:

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

Ein Werk Um zu empfehlen, füge folgenden Code hinzu (danke Glenn Maynard!):

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

Hoffe, dass andere mit dem gleichen Problem hilft, bis eine dauerhafte Lösung implementiert wird.

+0

Ich denke, dass der Code, den Sie zitiert haben, nur für Ajax-Ereignisse funktioniert, nicht für die einfachen onClick-Arten von Ereignissen, zu denen die Frage gestellt wurde. –

+0

Das ist "die" Lösung! Sie sollten die Ajax.Responders -> onException-Methode wie oben dargestellt implementieren. –

+0

Das ist ausgezeichnet, danke, dass du es schön mit allen Quellen ausgebreitet hast – febs