2011-02-06 12 views
5
function connectTo(url) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == xhr.DONE) { 
      throw "Troubles."; 
     } 
    }; 
    xhr.send(); 
} 

try { 
    connectTo("http://www.google.com"); 
} catch (e) { 
    console.log('Exception happend.'); 
} 

Quizás ejecutará la parte de "captura" (en la consola aparece el mensaje), pero la excepción estancias uncatched (= en la consola aparece "Los problemas no detectadas."). ¿Por qué?de lanzar y atrapar la excepción de la función

Respuesta

9

el lanzamiento no surge a través de una devolución de llamada como esa. Pase un error manejando la devolución de llamada y trátelo manualmente.

Vamos a ilustrar su pila traza

No hay ninguna conexión entre la función StackTrace onreadystatechange y la función ConnectTo. Entonces, cuando arrojas un error, nunca sube al bloque try catch alrededor de connectTo.

Lo que Firefox está haciendo es decir "Oh you did something that doesn't work. let me fix that for you and do what you think it does"

function connectTo(url, err) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == xhr.DONE) { 
      err.call(this, new Error("troubles")); 
     } 
    }; 
    xhr.send(); 
} 

connectTo("http://www.google.com", function(e) { 
    console.log(e); 
}); 
+0

bien entonces, pero ¿por qué está aquí try {} catch() disponible para su uso? –

+0

@RadekSimko no lo es. Usted maneja el error manualmente aquí – Raynos

+0

No estoy hablando de su código aquí, solo digo, ¿por qué no puedo usar try {} catch() {} en general para detectar excepciones? –

Cuestiones relacionadas