2010-04-08 24 views
5

Korzystanie z prototypowej wersji 1.6.0.2.Prototypowe funkcje oddzwaniania przełykanie wyjątki

Mam wspólny problem, w którym wyjątki są połknięte, gdy są wywoływane w funkcji wywołania zwrotnego, zazwyczaj gdy próbuję obsłużyć odpowiedź na wywołanie Ajax.Request. Oto prosty przykład:

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, więc problem jest, że jeśli uruchomić ten kod w Firefox z Firebug bez wyjątku będzie odtwarzany dla linii przestępczej - jest połknięta. Łyk. Jedyny znany mi sposób ich przechwycenia (powiedzmy, że debuguję) to zawinięcie zawartości funkcji wywołania zwrotnego w usłudze try/catch. Na przykład:

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

Czy ktoś jeszcze kiedykolwiek natknął się na ten problem? Czy są tam jakieś roboty?

Z góry dziękuję!

Odpowiedz

4

Na dzień dzisiejszy jest to znane zachowanie:

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

Jest to bilet w za rozszerzeniem do czynienia z tymi połknięcia wyjątki tutaj:

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

Jeden z pracą Sugerowane jest dodanie następującego kodu (dzięki Glenn Maynard!):

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

Nadzieję, że pomaga innym osobom z tym samym problemem, dopóki nie zostanie wdrożone bardziej trwałe rozwiązanie.

+0

Myślę, że kod, który cytowałeś, działa tylko w przypadku wydarzeń Ajax, a nie w przypadku prostych zdarzeń typu onClick, o które zadano pytanie. –

+0

To jest "rozwiązanie"! Powinieneś zaimplementować metodę Ajax.Responders -> onException, jak pokazano powyżej. –

+0

To jest doskonałe, dziękuję za przyjemne ułożenie go ze wszystkimi źródłami – febs

Powiązane problemy