2013-05-01 11 views
15

Aus irgendeinem Grund gibt mir dieser Code einen nicht abgefangenen Ausnahmefehler. Es scheint, dass der catch-Block den Fehler nicht abfängt. Sind try-catch-Blöcke so skaliert, dass ich keinen Fehler in einer verschachtelten Funktion ausgeben kann und dann erwarte, dass sie von einer Fanganweisung erfasst wird, die höher in der Kette liegt? Einige der sensiblen Daten in der Anwendung, in der ich arbeite, wurden entfernt, aber es wurde erwartet, dass leadInfo [0/1] eine alphanumerische Zeichenfolge mit 32 Zeichen ist, die ich aus URL-Parametern abrufe.Catch-Anweisung fängt keinen geworfenen Fehler

Das hier zugrunde liegende Problem ist, dass mein AJAX-Aufruf einen Fehler von der API zurückgibt und dieser Fehler nicht ordnungsgemäß in der Anwendung behandelt wird. Daher die Notwendigkeit für die throw-Anweisung. Der AJAX-Aufruf wird ordnungsgemäß abgeschlossen und gibt ein JSON-Objekt zurück, das die E-Mail-Adresse nicht als Eigenschaft enthält. Daher muss ich dies so behandeln, dass die Seite entsprechend geändert wird.

jQuery(document).ready(function(){ 
     try { 
      url = "http://api.com/api/v1/lead/" + leadInfo[1] 

      jQuery.ajax({ 
       type: 'GET', 
       contentType: 'application/json', 
       url: url, 
       dataType : 'jsonp', 
       success: function (result) { 

        result = jQuery.parseJSON(result); 

        if(!result.data.email){ 
         throw ('New exception'); 
        } 
        console.log(result); 
        jQuery('.email').html(result.data.email); 
       } 
      }); 


      jQuery('.surveryButton').click(function(){ 
       window.location.replace("http://" + pgInventory.host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0"); 
      }); 
     } 
     catch(err) { 
      jQuery('.email').html('your e-mail address'); 
      jQuery('#arrowContent').remove(); 
     } 
}); 

Antwort

35

Der Grund, warum Ihr try catch Block versagt, weil eine Ajax-Anforderung asynchron ist. Der try catch-Block wird vor dem Ajax-Aufruf ausgeführt und sendet die Anfrage selbst, aber der Fehler wird ausgelöst, wenn das Ergebnis AT A LATER POINT IN TIME zurückgegeben wird.

Wenn der Block try catch ausgeführt wird, liegt kein Fehler vor. Wenn der Fehler ausgelöst wird, gibt es keine try catch. Wenn Sie try catch für Ajax-Anfragen benötigen, setzen Sie immer Ajax try catch Blöcke in den success Rückruf, NIE außerhalb davon.

Hier ist, wie Sie es tun sollten:

success: function (result) { 
    try { 
     result = jQuery.parseJSON(result); 

     if (!result.data.email) { 
     throw ('New exception'); 
     } 
     console.log(result); 
     jQuery('.email').html(result.data.email); 
    } catch (exception) { 
     console.error("bla"); 
    }; 
} 
+0

Es sieht aus wie Ich hatte ein wenig Verständnis für JSONP-Aufrufe. Ich hatte den Eindruck, dass JSONP-Aufrufe immer synchron sein mussten, stellt genau das Gegenteil fest, sie sind immer gezwungen, asynchron zu sein. Dies macht jetzt völlig Sinn, dass dieses kleine bisschen Information aufgelöst wurde. Danke, für die schnelle Antwort! – Xenology

1

Das Problem ist, dass Ajax definitions asynchron ist. Ihre Ausnahme wird nicht innerhalb der Funktion $.ajax ausgelöst, sondern von Rückruffunktion Funktion auf Erfolg (die zu einem späteren Zeitpunkt ausgelöst wird).

Sie sollen einen error: function(data) {} Parameter geben als auch, Server-Antwort Fehler zu behandeln und darüber hinaus sollten Sie den try/catch-Block innerhalb der Callback-Funktion setzen.

Wenn Sie es wirklich außerhalb des Rückrufs abfangen wollen, dann sollten Sie erwägen, eine Funktion aufzurufen, anstatt eine Ausnahme auszulösen, weil ich nicht sehe, wie es gemacht werden kann.

1

Aufgrund der asynchronen Art der Callback-Methoden in Javascript unterscheidet sich der Kontext der Funktion, die den Fehler wirft, vom ursprünglichen. Sie sollten diese Art und Weise tun:

success: function (result) { 
    try { 
    result = jQuery.parseJSON(result); 
    if(!result.data.email){ 
     throw ('New exception'); 
    } 
    console.log(result); 
    jQuery('.email').html(result.data.email); 
    } 
    catch(err) { 
    // Dealing with the error 
    } 
} 

Ich würde Ihnen vorschlagen, einen Blick auf dieses hervorragende article über die (ganz besonders) haben Kontexte, Verschlüsse und Bindungen in javascrit