2013-05-01 42 views
15

Per qualche motivo questo codice mi dà un errore di eccezione non rilevata. Sembra che il blocco catch non stia rilevando l'errore. I blocchi di catch sono stati esaminati in modo tale da non poter generare un errore in una funzione nidificata e quindi aspettarsi che venga catturato da un'istruzione catch posta nella parte superiore della catena? Alcuni dei dati sensibili contenuti nell'applicazione in cui sto lavorando sono stati rimossi, ma ci si aspettava che leadInfo [0/1] fosse una stringa alfanumica di 32 caratteri che estraggo dai parametri URL.L'istruzione di cattura non cattura l'errore generato

Il problema sottostante è con la mia chiamata AJAX che restituisce un errore dall'API e che l'errore non viene gestito correttamente all'interno dell'applicazione. Da qui la necessità dell'affermazione del tiro. La chiamata AJAX è completa e restituisce un oggetto JSON che non contiene l'indirizzo e-mail come proprietà, quindi devo gestirlo in un modo che modifichi la pagina per rispecchiare tale.

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

risposta

35

Il motivo per cui il tuo blocco try catch sta fallendo è perché una richiesta AJAX è asincrona. Il blocco catch try verrà eseguito prima della chiamata Ajax e invierà la richiesta stessa, ma l'errore viene generato quando viene restituito il risultato, AT A LATER POINT IN TIME.

Quando viene eseguito il blocco try catch, non si verifica alcun errore. Quando viene generato l'errore, non c'è try catch. Se è necessario il numero try catch per le richieste Ajax, inserire sempre i blocchi ajax try catch all'interno del callback success, MAI al di fuori di esso.

Ecco come si dovrebbe fare:

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

Sembra Ho avuto la mia comprensione delle chiamate JSONP un po 'indietro. Avevo l'impressione che le chiamate JSONP fossero sempre costrette a essere sincrone, risulta esattamente l'opposto, sono sempre costrette a essere asincrone. Questo ha perfettamente senso ora che quel po 'di informazione è stata risolta. Grazie per la pronta risposta! – Xenology

1

Il problema è che l'Ajax è asincrono per definizione. L'eccezione non viene generata dalla funzione $.ajax, ma dalla funzione callback in caso di esito positivo (che viene attivato in un secondo momento).

si dovrebbe dare un parametro error: function(data) {} ad esso pure, per gestire gli errori di risposta del server, e, inoltre, è necessario posizionare il blocco try/catch all'interno la funzione di callback.

Se si desidera catturarlo al di fuori della richiamata, è consigliabile prendere in considerazione la chiamata di una funzione anziché lanciare un'eccezione, perché non vedo come possa essere eseguita.

1

A causa della natura asincrona dei metodi di callback in javascript, il contesto della funzione che genera l'errore è diverso da quello originale. Si dovrebbe fare in questo modo:

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

vorrei suggerire di dare un'occhiata a questo eccellente article circa il (molto particolare) contesti, chiusure e attacchi in javascrit