2011-02-06 3 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.'); 
} 

Возможно, «улов» часть будет выполняться (в консоли появится сообщение), но исключение остается uncatched (= в консоли появятся «неперехваченная смута.»). Почему?метание и ловли исключение из функции

ответ

9

бросок не пузырится через обратный вызов, как этот. Передайте обратный вызов обработки ошибок и обработайте его вручную.

Позвольте мне проиллюстрировать ваш стек следы

Там нет никакой связи StackTrace между функцией onreadystatechange и функции ConnectTo. Поэтому, когда вы бросаете ошибку, она никогда не пузырится до блока catch try вокруг connectTo.

Что светлячок делает говорит "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

OK тогда, но почему здесь пытаются поймать {}() доступны для использования? –

+0

@ RadekSimko это не так. Ваша обработка ошибки вручную здесь – Raynos

+0

Я не говорю о вашем коде здесь, я просто говорю, почему я не могу использовать try {} catch() {} для исключения исключений? –

Смежные вопросы